oj

Luogu P5354 [Ynoi2017]由乃的OJ

*爱你&永不变心* 提交于 2019-12-05 07:26:44
题目 这题以前叫睡觉困难综合征。 首先我们需要知道起床困难综合征怎么做。 大概就是先用一个全 \(0\) 和全 \(1\) 的变量跑一遍处理出每一位 \(1\) 和 \(0\) 最后会变成什么。 然后高位贪心:如果当前位能够从 \(0\) 到 \(1\) ,那么直接选上。如果能够从 \(1\) 到 \(0\) ,那么能选就选。 现在我们把它放到了树上。 那么使用LCT或者树剖就可以解决了。 #include<bits/stdc++.h> #define N 100007 #define ull unsigned long long using namespace std; namespace IO { char ibuf[(1<<21)+1],obuf[(1<<21)+1],st[22],*iS,*iT,*oS=obuf,*oT=obuf+(1<<21); char Get() { return (iS==iT? (iT=(iS=ibuf)+fread(ibuf,1,(1<<21)+1,stdin),(iS==iT? EOF:*iS++)):*iS++); } void Flush() { fwrite(obuf,1,oS-obuf,stdout),oS=obuf; } void Put(char x) { *oS++=x; if(oS==oT) Flush(); } ull

2019.11.21 做OJ题的反思

假如想象 提交于 2019-12-05 03:57:41
1.利用 二分法 查找数组元素(适用于有序数组)    1 #include<stdio.h> 2 int BinarySearch(int a[],int n,int key); 3 int arr[2000050]; 4 5 int main(void) 6 { 7 int n,m,i; 8 int num; 9 10 scanf("%d%d",&n,&m); 11 for(i=0;i<n;i++) 12 { 13 scanf("%d",&arr[i]); 14 } 15 for(i=1;i<=m;i++) 16 { 17 scanf("%d",&num); 18 printf("%d",BinarySearch(arr,n,num)); 19 if(i==m) printf("\n"); 20 else printf(" "); 21 } 22 return 0; 23 } 24 int BinarySearch(int a[],int n,int key) 25 { 26 int left=0,right=n-1; 27 int middle,i=0; 28 while(left<=right) 29 { 30 middle=(left+right)/2; 31 if(a[middle]>key) 32 right=middle-1; 33 if(a[middle]<key

Comet OJ - Contest #11 B题 usiness

无人久伴 提交于 2019-12-04 18:46:59
###题目链接### 题目大意: 一开始手上有 0 个节点,有 n 天抉择,m 种方案,在每天中可以选择任意种方案、任意次得花费 x 个节点(手上的节点数不能为负),使得在 n 天结束后,获得 y 个节点。 其次,在每天结束后,会根据自己手上所具有的节点数来获得一些节点,设当天结束后所拥有 x 个节点,那么将获得 f(x) 个节点。 分析: 1、将全过程分为 n 天,每天开始有一定的节点数,然后 DP 求得花费后的最大价值(这个最大价值指的是,n 天结束后仅返还获得的最大节点数)。 故设 dp[i][j] 表示在第 i 天花费操作完后,所能在最后一天返还节点数的最大值。 2、很显然这是一个完全背包问题。在 DP 处理每天话费节点之前,需要更新当天最开始所拥有的节点数所代表的 价值 (即结束返还的总节点数)。而当天一开始的节点数由上一天末尾所持有的节点数 x + 上一天结束后获得的节点数 f(x) 。 故枚举上一天结束后所持有的节点数 j ,则 有: dp[i][j+f[j]]=max(dp[i][j+f[j]] , dp[i-1][j]) 。 直接枚举物品数: #include<iostream> #include<algorithm> #include<string.h> using namespace std; int n,m,k; int s[1008]; int dp

OJ的搭建---前言

陌路散爱 提交于 2019-12-04 16:35:01
OJ,是online judge的简称 因为学院的原因,没有大创就不能毕业,嘤嘤嘤~~ 参见大创的ACMer啥也不会,只懂oj,听学长说实验室要做一个oj,想一想,还不如趁此机会做一个 问了laochen,cs,wbh,多少都给予了一些帮助,特别是laochen,真香 在学院的kb下,报名了参加大创,虽然没有得到的laopan的看好,但是我对这个东西仿佛有了一种感情,我一定要做它 希望一年后东西可以做出来,加油 常见的 OJ工作原理: 在线评测系统,通过对代码的编译,在合理的内存和时间内对代码进行评测 常见的结果有5种,分别是:编译错误,运行错误,超时,答案错误,通过 测试是黑盒测试 2333,我太菜了 目前想法:php+Apache+Ubuntu 希望一年之后会有更好的成果 不断更新中,,, 今天吉剑终于更新文章了,文章名:真正让人绝望的不是工作,而是上班。 来源: https://www.cnblogs.com/Vagrant-ac/p/11874614.html

【NOI OJ】1818 红与黑

ぃ、小莉子 提交于 2019-12-04 05:10:02
1818:红与黑 总时间限制: 1000ms 内存限制: 65536kB 描述 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。 输入 包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下 1)‘.’:黑色的瓷砖; 2)‘#’:白色的瓷砖; 3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。 当在一行中读入的是两个零时,表示输入结束。 输出 对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。 样例输入 6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 0 0 样例输出 45 来源 1979 #--------------------------------------------------------------------------------# 还是一道DFS的深搜题,主体思路: 找到“@”后,进入函数,上下左右搜索,if(跑出数组||撞墙)便return 递归一次便sum+

Comet OJ模拟赛 Day1

大憨熊 提交于 2019-12-04 03:30:50
A. 修行 题目概述:一次操作选定一个区间,将区间内数的总和赋给区间内的某个数并清零区间内的其他数。判断 \(a\) 序列是否能变成 \(b\) 序列,如果能则输出最小操作数。 满分做法: 用双指针记录现在到了&a&序列的位置和 \(b\) 序列的位置,每次 \(b[i]\) 不等于0时, \(ans++\) ,如果本身a[i]本身就符合条件再减回来。剩下的加就行了,如果加不够就输出-1. 另外需要开始判总和是否相等。 #include<queue> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> #include<iostream> using namespace std; typedef long long ll; const int maxm=1e+7; int t,n,ans; int a[maxm],b[maxm]; int solve() { int r=1; ll sum=0; ans=0; for(int i=1;i<=n;i++) { if(!b[i]) continue; ans++; int l=r; sum=0; while((sum<b[i])&&(r<=n)) sum+=a[r++]; if(sum!=b[i]){ return -1; } if(i>=l&&i

Comet OJ - Contest #13 补题题解

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-04 02:04:35
A.险恶的迷宫 题意 :在二维平面坐标内,给出一个圆心坐标 (a,b),以及圆的半径 r , 再给出 n 个点的坐标 (x_i,y_i), 求有多少点在圆内。 数据范围 :0 < n <= 1e5, 0< r , x , y <=1e9 思路: 对于判断距离根据勾股定理: sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) <= r ,即在圆的范围内。由于此题数据较大,sqrt可能导致精度损失,所以直接开long long 进行平方比较 :(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2 )<= r*r; #include <bits/stdc++.h> typedef long long ll; using namespace std; const int maxn = 1e5+7; int main(){ int n; ll a,b,r; cin>>n>>a>>b>>r; int ans = 0; for(int i=1;i<=n;i++){ ll x,y; cin>>x>>y; if((x-a)*(x-a)+(y-b)*(y-b)<=r*r) ans++; } cout<<ans<<endl; } B.夕日的光辉 题意 :给出长为 n 的字符串 str . 找到pink的子串序列. 求符合条件组成的pink自序列,相邻两个 (

Comet OJ - Contest #14题解

99封情书 提交于 2019-12-04 01:42:47
Contest14的本质:区间覆盖+Tarjan( A 把距离公式两边平方即可 注意要long long code #include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #define fo(a,b,c) for (a=b; a<=c; a++) #define fd(a,b,c) for (a=b; a>=c; a--) using namespace std; int x[100001]; int y[100001]; int n,i,j,k,l,X,Y,R,ans; int main() { // freopen("a.in","r",stdin); scanf("%d%d%d%d",&n,&X,&Y,&R); fo(i,1,n) scanf("%d%d",&x[i],&y[i]); fo(i,1,n) if (((long long)(x[i]-X)*(x[i]-X)+(long long)(y[i]-Y)*(y[i]-Y))<=(long long)R*R) ++ans; printf("%d\n",ans); } B 显然p和k是位置最靠边的两个 考虑一下i和n的位置(靠左/靠右/左右) code 比较丑 #include

Comet OJ - Contest #8 E.神奇函数

前提是你 提交于 2019-12-04 01:40:54
旧题解: https://blog.csdn.net/gmh77/article/details/99066792#commentBox 之前写的有些奇怪, 不能体现这道题的sb 所以再推一遍 \(\because n=\sum_{d \mid n}{\varphi(d)}\) \(\therefore \sum_{i=1}^{n}{f(i)}=\sum_{n}{\prod{{a_i}^{\left \lfloor \frac{p_i}{2} \right \rfloor}}}\) \(=\sum_{n}{\sum_{\prod{{a_i}^{\left \lfloor \frac{p_i}{2} \right \rfloor}} \mid d}{\varphi(d)}}\) \(=\sum_{d=1}^{\left \lfloor \sqrt{n} \right \rfloor}{\varphi(d)\sum_{n}{[d^2\mid n]}}\) $ \(=\sum_{d=1}^{\left \lfloor \sqrt{n} \right \rfloor}{\varphi(d)*\left \lfloor \frac{n}{d^2} \right \rfloor}\) 来源: https://www.cnblogs.com/gmh77/p/11827264.html

Comet OJ - Contest #14

倾然丶 夕夏残阳落幕 提交于 2019-12-04 00:04:23
Rank38。 还是比较不满意吧,C卡了太久,E没调出来,D也没空去做了。 A 签到题。 #include<bits/stdc++.h> using namespace std; #define ll long long const int N=100007; int x[N],y[N]; ll sqr(ll x){return 1ll*x*x;} ll dis(ll x,ll y,ll a,ll b){return sqr(x-a)+sqr(y-b);} int main() { ll ans=0,n,i,a,b,x,y,r; cin>>n>>a>>b>>r; for(i=1;i<=n;++i) { cin>>x>>y; if(dis(x,y,a,b)<=sqr(r)) ++ans; } cout<<ans; } B 计算 \(p,i,n\) 分别最前能放在哪里, \(i,n,k\) 最后能放在哪里。 #include<bits/stdc++.h> using namespace std; vector<int>pos[5]; const int N=1000007; char s[N];int n,mp[1001]; int Finda(int x) { int p=0; for(int i=1;i<=x;++i) { auto it=lower_bound(pos[i]