随笔分类 - codeforce
摘要:前三题特水~~~~第四题,迪杰斯特拉算法。只需在裸的算法改点东西就行#include#include#include#include#define maxn 100005#define inf 1t.d; }};struct Di{ int n,m,ans; vectored; ...
阅读全文
摘要:在第8组数据上WA了一天,后来才发现问题;#include#include#include#include#define maxn 200009#define inf 1e15using namespace std;int n,k,q;struct node{ int score; int pain; bool operatorb.score;}bool vis[maxn];int s[maxn];long long check(int p){ long long ans=0; int cnt_1=0; for(int i=1;i=p-1)cnt_1++; ...
阅读全文
摘要:这道题目的意思是对于每个要删除的数字,向前或向后找到一块连续的数字,而它是其中最小的;很容易看出对于所有要先删除的数字要从大到小删除;然后对于每个要删除的字母,要找到比他小的,但是在原数列中又靠它最近的数字;这样的话,很直观最多只能用lg n的复杂度来处理这个问题;可以用二分查找,也可以用set来代替;考虑到前面删除的一些数字不能计算进去,还要一个快速计算区间和的算法,用树状数组和线段树都可以;不过看到tags,上面写着还可以用dsu(disjoint set union)并查集来做;感觉挺神奇的,想到了之后再补上!#include#include#include#include#define
阅读全文
摘要:直接从后面往前面扫,如果前面大,就把后面丢掉再把前面剩下的进行类似的处理就行;#include#include#include#define maxn 100005using namespace std;char s[maxn];int main(){ cin>>s; int l=strlen(s); int head=l-1,tail=l-1; int cnt=1; while(1) { while(s[head]=='0')head--; if(head>(tail-head+1)) { c...
阅读全文
摘要:本题的主要算法就是区间更新和区间求和;可以用线段树和树状数组来做;感觉线段树写的太麻烦了,看到官方题解上说可以用树状数组做,觉得很神奇,以前用过的树状数组都是单点维护,区间求和的;其实树状数组还可以区间维护,单点求值;和区间维护,区间求和的;详情请见博客。#include#include#include#include#define maxn 4000010#define ll long longusing namespace std;ll a[2][maxn];ll b[2][maxn];void add_a(int flag,int x,ll value){ while(x>0) .
阅读全文
摘要:几个小结论:1.路径长度=i+j-1;2.最简单的走法是先横走再竖着走或者先竖着走再横着走#include#includeusing namespace std;void print(int x,int y){ for(int i=1; im)continue; ans+=l-1; cnt++; if(cnt>=k)break; } if(cnt>=k)break; } printf("%d\n",ans);// printf("%d %d\n",l,i); for(; ...
阅读全文
摘要:这个题目看似不是很好下手,不过很容易发现每次询问的时候总是会问到第r个盒子是否有糖果;这样的话就很好办事了;维护两个数组;一个sum数组:累加和;一个in数组:如果i位是1的话,in[i]=in[i-k]+1;否则不加1,很好理解;然后利用in数组可以找到本来应该有糖果的但是没有糖果的箱子的数目;然后结合sum数组就可以的出结果;#include#include#define maxn 100005using namespace std;char s[maxn];int sum[maxn];int in[maxn];int n,w,k;int main(){ scanf("%d%d%
阅读全文
摘要:刚刚看到这个题感觉是博弈题;不过有感觉不像,应该是个贪心;于是就想贪心策略;举了一个例子:33 1 2 34 3 4 1 25 4 1 2 5 8如果他们两个每次都拿对自己最有利的那个的话,C的得分是14分;但是C作为第一个选手,他有更好的策略,只拿前一半,后一半给J,中间的再分;这样的话C的得分就能达到15分;同样J也有这样的策略,他也能保证自己最少能拿到后一半的分(跟风式的拿);这样的话,贪心策略就明朗了!#include#include#include#define maxn 105using namespace std;int s[maxn];int c,j;int main(){ .
阅读全文
摘要:这个题目的突破口就是固定最短长度,然后以二进制的形式分层;最后把需要的曾连起来;#include#include#define maxn 105using namespace std;bool map[maxn][maxn];void link(int x,int y){ map[x][y]=1; map[y][x]=1;}void pre(){ link(1,3); link(1,4); link(2,100); for(int i=3; i<60; i+=2) { link(i,i+2); link(i,i+3); ...
阅读全文
摘要:把前n个碟子从第一个塔移动到第三个塔有两种方法:1.把前n-1个移动到第二个塔,把第n个移动到第三个塔,然后把前n-1个从第二个移动到第三个;2.把前n-1个移动到第三个塔,把第n个移动到第二个塔,然后把前n-1个继续移动到第一个的塔,把第N个移动到第三个塔,最后把前n个移动到第三个塔就行了;状态转移方程:a=dp[i][3-i-j][k-1]+matrix[i][j]+dp[3-i-j][j][k-1];b=dp[i][j][k-1]+matrix[i][3-i-j]+dp[j][i][k-1]+matrix[3-i-j][j]+dp[i][j][k-1];dp[i][j][k]=min(a
阅读全文
摘要:我的方式是用暴力的方法找到每一行每一列的边界点;但是有大神直接用一个公式解决了:floor(n*sqrt(2))*4;想了很久还是不理解,求各路大神指点!#include#include#includeusing namespace std;int main(){ long long n; cin>>n; if(n==0){cout1) ans+=pre-cur-1; pre=cur; } ans--; cout<<ans*4;}View Code
阅读全文
摘要:详解见:http://blog.csdn.net/tri_integral/article/details/18666797#include#include#define maxn 105#includeusing namespace std;int s[maxn];int main(){ int n; int tmp; while(scanf("%d",&n)!=EOF) { memset(s,0,sizeof s); s[50]=n; bool flag; while(1) { ...
阅读全文
摘要:一开始贪心策略想错了!#include#includeusing namespace std;int s[105];int main(){ int n; scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%d",&s[i]); } sort(s,s+n); int ans; bool flag; for(int k=1;k<=n;k++) { flag=1; for(int i=0;i<n;i++) if(s[i]<i/k) ...
阅读全文
摘要:#include#includeusing namespace std;char s[30]="iiiiiiiiiiiiiiiiiiiiii";int n;void solve(int re,int now,bool flag){ if(re==0) { s[now]='\0'; printf("%s\n",s); return; } if(re==1) { s[now]='\0'; printf("%si\n",s); return; } if(flag) { ...
阅读全文
摘要:难得一次比赛能够自己成功A掉四个题;A题:水题,模拟一下就行; 1 #include 2 #include 3 using namespace std; 4 5 void print(int x) 6 { 7 if(x>=5){printf("-O|");x%=5;} 8 else printf("O-|"); 9 if(x==0)puts("-OOOO");10 else if(x==1)puts("O-OOO");11 else if(x==2)puts("OO-OO");12 els
阅读全文
摘要:A:简单题: 1 #include 2 using namespace std; 3 4 int n,k; 5 int main() 6 { 7 scanf("%d%d",&n,&k); 8 for(int i=0; i 2 using namespace std; 3 4 int n,k; 5 int main() 6 { 7 scanf("%d%d",&n,&k); 8 if((n==1&&k==1)||k==n) 9 {10 puts("-1");11 return 0;12 }1
阅读全文
摘要:A:要么是两次要么4次,判断是否在边界; 1 #include 2 using namespace std; 3 4 int main() 5 { 6 int n,m,x; 7 bool flag=0; 8 scanf("%d%d",&n,&m); 9 for(int i=0; i 2 using namespace std; 3 4 int main() 5 { 6 int n,k; 7 scanf("%d%d",&n,&k); 8 for(int i=1;i 2 #include 3 #include 4 #defin
阅读全文
摘要:A - Dima and Continuous Line水题:直接模拟; 1 #include 2 #define maxn 1005 3 using namespace std; 4 int x[maxn],y[maxn]; 5 int main() 6 { 7 int n,a,b,last; 8 scanf("%d",&n); 9 bool flag=1;10 for(int i=0;ib)17 {18 a=a^b;19 b=a^b;20 a=a^b;21 ...
阅读全文
摘要:A:简单题,因为题目中说了不会有数据相同; 1 #include 2 #include 3 #define maxn 200005 4 using namespace std; 5 6 struct node 7 { 8 int a[3]; 9 int id;10 bool operator =m2&&no[i].a[1]>=m3)34 bb[cnt++]=no[i].id;35 }36 printf("%d\n",cnt);37 sort(bb,bb+cnt);38 for(int i=0;i 2 #inclu...
阅读全文
摘要:A:大水题;代码: 1 #include 2 #define ll long long 3 using namespace std; 4 5 int main() 6 { 7 ll n,m,a; 8 cin>>n>>m>>a; 9 cout 2 #include 3 #define maxn 1000005 4 using namespace std; 5 int n; 6 char s[50]; 7 void a_to_b() 8 { 9 int a,b;10 int p=maxn-1;11 char t[maxn];12 sscan...
阅读全文