标签:close nes return nbsp class fine com isp logs
=====》【补题:F G 】【学习:平衡树】《=====
A. Tetris
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define fre(i,t,n) for(int i =(t);i<=(n);++i) 4 #define fer(i,n,t) for(int i =(n);i>=(t);--i) 5 #define mp make_pair 6 #define pb push_back 7 typedef long long ll; 8 void smain(); 9 int main(){ 10 ios::sync_with_stdio(false); 11 smain(); 12 return 0; 13 } 14 const int MAXN = 1000+10; 15 int X[MAXN]; 16 void smain(){ 17 int n,m; 18 cin>>n>>m; 19 fre(i,1,m) 20 { 21 int d; 22 cin>>d; 23 X[d]++; 24 } 25 int g=X[1]; 26 fre(i,1,n) 27 { 28 g=min(X[i],g); 29 } 30 cout<<g<<endl; 31 }
B. Lecture Sleep
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define fre(i,t,n) for(int i =(t);i<=(n);++i) 4 #define fer(i,n,t) for(int i =(n);i>=(t);--i) 5 #define mp make_pair 6 #define pb push_back 7 typedef long long ll; 8 void smain(); 9 int main(){ 10 ios::sync_with_stdio(false); 11 smain(); 12 return 0; 13 } 14 const int MAXN = 1e5+10; 15 ll A[MAXN],B[MAXN],C[MAXN]; 16 void smain(){ 17 int n,k; 18 cin>>n>>k; 19 fre(i,1,n) 20 { 21 cin>>A[i]; 22 } 23 ll sum=0; 24 fre(i,1,n) 25 { 26 int d; 27 cin>>d; 28 if(d) sum+=A[i],A[i]=0; 29 } 30 fre(i,1,n) 31 { 32 A[i]+=A[i-1]; 33 } 34 ll Max=0; 35 fre(i,k,n) 36 { 37 Max=max(A[i]-A[i-k],Max); 38 } 39 cout<<sum+Max<<endl; 40 }
C. Chessboard
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define fre(i,t,n) for(int i =(t);i<=(n);++i) 4 #define fer(i,n,t) for(int i =(n);i>=(t);--i) 5 #define mp make_pair 6 #define pb push_back 7 typedef long long ll; 8 void smain(); 9 int main(){ 10 ios::sync_with_stdio(false); 11 smain(); 12 return 0; 13 } 14 int S[]{0,0,1,1}; 15 const int MAXN = 100+3; 16 char A[MAXN][MAXN]; 17 int n; 18 void GetAns(int &a,int &b) 19 { 20 fre(i,0,n-1) 21 { 22 cin>>A[i]; 23 } 24 a=0,b=0; 25 fre(i,0,n-1) 26 { 27 fre(j,0,n-1) 28 { 29 a+=(A[i][j]!=(‘0‘+(i+j)%2)); 30 b+=(A[i][j]!=(‘1‘-(i+j)%2)); 31 } 32 } 33 } 34 int B[4][2]; 35 void smain(){ 36 cin>>n; 37 fre(i,0,3) 38 { 39 GetAns(B[i][0],B[i][1]); 40 } 41 int ans=n*n*4-1; 42 do{ 43 int sum=0; 44 fre(i,0,3) 45 { 46 sum+=B[i][S[i]]; 47 } 48 ans=min(ans,sum); 49 }while(next_permutation(S,S+4)); 50 cout<<ans<<endl; 51 }
D. Pair Of Lines
这题想法是这样的:
首先,只有4个点的话XJB随便画都可以
对于点数>4:选点1,2,3作讨论:
1)1,2在同一条线上:那就判断剩下哪些点也在这条线上,再判断不属于这条线的点是否构成一条直线
2)1,2不在同一条线上,那么3要么最后跟1在一块,要么最后跟2在一块,处理同1)
P.S.:对于斜率,为了避免精度,特意用了互质的两个数表示分数,负数永远属于分子。不过一开始没注意处理(3,0) (5,0) 和(0,3) (0,-5) 这种情况WA了几发=-=最后处理是把(x,0)->(1,0),(0,x)->(0,1)酱紫
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define fre(i,t,n) for(int i =(t);i<=(n);++i) 4 #define fer(i,n,t) for(int i =(n);i>=(t);--i) 5 #define mp make_pair 6 #define pb push_back 7 typedef long long ll; 8 void smain(); 9 int main(){ 10 ios::sync_with_stdio(false); 11 smain(); 12 return 0; 13 } 14 const int MAXN = 1e5+100; 15 int X[MAXN],Y[MAXN]; 16 bool flag[MAXN]; 17 typedef pair<ll,ll> Pii; 18 Pii Get(int i,int j) 19 { 20 ll x=X[i]-X[j],y=Y[i]-Y[j]; 21 ll f=1; 22 if(x<0) f=-f,x=-x; 23 if(y<0) f=-f,y=-y; 24 if(x==0) return mp(0,1); 25 if(y==0) return mp(1,0); 26 ll g=__gcd(x,y); 27 return mp(x/g*f,y/g); 28 } 29 int n; 30 int step1(int st,Pii T,int &t1,int &t2,int x) 31 { 32 int noin=0; 33 memset(flag,0,sizeof flag); 34 fre(i,st,n) 35 { 36 if(Get(x,i)==T) 37 flag[i]=true; 38 else{ 39 noin++; 40 if(noin==1) t1=i; 41 if(noin==2) t2=i; 42 } 43 } 44 return noin; 45 } 46 bool step2(int st,Pii tmp,int t1) 47 { 48 fre(i,st,n) 49 { 50 if(!flag[i]) 51 { 52 if(i==t1) continue; 53 if(tmp!=Get(t1,i)) return false; 54 } 55 } 56 return true; 57 } 58 void smain(){ 59 cin>>n; 60 fre(i,1,n) 61 { 62 cin>>X[i]>>Y[i]; 63 } 64 if(n<=4) 65 { 66 cout<<"YES"<<endl; 67 return; 68 } 69 /*in one*/ 70 Pii T=Get(1,2); 71 int t1,t2; 72 int noin=step1(3,T,t1,t2,1); 73 flag[1]=flag[2]=true; 74 if(noin<=2) 75 { 76 cout<<"YES"<<endl; 77 return; 78 } 79 Pii tmp=Get(t1,t2); 80 if(step2(3,tmp,t1)) 81 { 82 cout<<"YES"<<endl; 83 return; 84 } 85 86 /* 1-3 */ 87 T=Get(1,3); 88 noin=step1(3,T,t1,t2,1); 89 if(noin<=1) 90 { 91 cout<<"YES"<<endl; 92 return; 93 } 94 95 tmp=Get(2,t1); 96 if(step2(3,tmp,2)) 97 { 98 cout<<"YES"<<endl; 99 return; 100 } 101 102 /* 2-3 */ 103 T=Get(2,3); 104 noin=step1(3,T,t1,t2,2); 105 if(noin<=1) 106 { 107 cout<<"YES"<<endl; 108 return; 109 } 110 111 tmp=Get(1,t1); 112 if(step2(3,tmp,1)) 113 { 114 cout<<"YES"<<endl; 115 return; 116 } 117 cout<<"NO"<<endl; 118 }
E. Tufurama
敲喜欢这道题的=-=
其实题意无非就是对1<=i<=N,问 j=[1, Ai ] 中有多少个Aj>=i。
考虑转换一下问题,就是:对1<=i<=N,有多少个 Aj>=i 使得 j=[1, Ai]。
对转换后的问题,把(Ai,i) 对从大到小排列,倒序处理i,对每个i,首先把所有 Ax>=i 的 (Ax,x)出列,把x扔到线段树(或者平衡树里面),然后线段树里询问 [1, Ai] 中有多少个数就好了
自己推的就是爽=-=我都好佩服我寄己
下来有空要看一下平衡树
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define fre(i,t,N) for(int i =(t);i<=(N);++i) 4 #define fer(i,N,t) for(int i =(N);i>=(t);--i) 5 #define mp make_pair 6 #define pb push_back 7 typedef long long ll; 8 void smain(); 9 int main(){ 10 ios::sync_with_stdio(false); 11 smain(); 12 return 0; 13 } 14 #define lson l,m,rt<<1 15 #define rson m+1,r,rt<<1|1 16 typedef pair<ll,int> Pii; 17 priority_queue<Pii> qu; 18 const int MAXN = 2e5+10; 19 ll Tree[MAXN<<2]; 20 int n; 21 void Update(int pos,int l=1,int r=n,int rt=1) 22 { 23 if(l==r) 24 { 25 Tree[rt]=1; 26 return; 27 } 28 int m=(l+r)>>1; 29 if(pos<=m) Update(pos,lson); 30 else Update(pos,rson); 31 Tree[rt]++; 32 } 33 ll Query(int L,int R,int l=1,int r=n,int rt=1) 34 { 35 if(L<=l&&r<=R) 36 return Tree[rt]; 37 int m=(l+r)>>1; 38 ll ans=0; 39 if(L<=m) ans+=Query(L,R,lson); 40 if(R>m) ans+=Query(L,R,rson); 41 return ans; 42 } 43 ll A[MAXN]; 44 void smain(){ 45 cin>>n; 46 ll gg=0; 47 fre(i,1,n) 48 { 49 cin>>A[i]; 50 gg+=(A[i]>=i); 51 qu.push(mp(A[i],i)); 52 } 53 ll ans=0; 54 fer(i,n,1) 55 { 56 while(!qu.empty()&&qu.top().first>=i) 57 { 58 Update(qu.top().second); 59 qu.pop(); 60 } 61 ans+=Query(1,A[i]); 62 } 63 cout<<(ans-gg)/2<<endl; 64 }
F. k-substrings
G. Partitions
咸鱼已经懒得写题解了 = - = 有不懂的可以评论或者私下联系
版权所有:scidylanpno
原文链接:http://www.cnblogs.com/scidylanpno/p/8745965.html
Educational Codeforces Round 41 (Rated for Div. 2)
标签:close nes return nbsp class fine com isp logs
原文地址:https://www.cnblogs.com/scidylanpno/p/8745965.html