day12

Frost_Delay

2019-08-12 14:21:43

Personal

自闭了,今天真傻逼 11:28写的 ```cpp wdnmd本来今天看到题就觉得难,写完两题居然还手残格式化D盘,心态崩了,10:30重写前两题,11:00写完,发现第二题题意理解错了,又马上改, 11:25改完,发现还有漏洞,时间已经不够改了,于是写下这段文字,纪念今天自闭的我,警示自己以后不要随便乱点东西,我真是傻逼 ``` 今天得分 0/50; T1没理解到精髓,一道贪心被我写成这样我也是醉了; 主要判断能否分割,能分直接分 AC ```cpp #include<iostream> #include<cstdio> using namespace std; inline int read() { int x=0,f=1;char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();} return x*f; } int n,t,k; long long s[100000+5][2]; long long zb,zw,ans; char c,lastc; bool judge(long long x,long long y) { return zb*y==zw*x; } long long need(long long y) { if(y*zb%zw!=0)return-1; return zb*y/zw; } long long need1(long long x) { if(x*zw%zb!=0)return -1; return zw*x/zb; } int main() { freopen("silly.in","r",stdin);freopen("silly.out","w",stdout); t=read(); while(t--) { for(int i=1;i<=n;i++) s[i][0]=s[i][1]=0; zb=zw=0;lastc=0;ans=0; n=read(); for(int i=1;i<=n;i++) { k=read();cin>>c; if(c==lastc) { n--;i--; } lastc=c; if(c=='B') { s[i][0]+=k; zb+=k; } if(c=='W') { s[i][1]+=k; zw+=k; } } if(!zb||!zw) { cout<<zb+zw<<endl; continue; } long long pb=0,pw=0; for(int i=1;i<=n;i++) { if(s[i][0]) { long long z=need(pw); if(z>pb&&z<=s[i][0]+pb) { ans++; } pb+=s[i][0]; } if(s[i][1]) { long long z=need1(pb); if(z>pw&&z<=s[i][1]+pw) { ans++; } pw+=s[i][1]; } } printf("%lld\n",ans); } return 0; } ``` T3玄学做法 语出某些大佬 ```cpp T3:把所有的数放进一个数组排序,输出中间两个即可,证明参见绝对值不等式...刚学完不到半年就忘,是我zz了... T3:排序取中间值,证明略 ``` lzc大佬的证明 T3: 这题随便你怎么二分三分…… 不过有一个更优美的结论。 我们设取到的其中一个极值点在![](https://latex.codecogs.com/gif.latex?%5Cinline%20w) ,再设两个值 ![](https://latex.codecogs.com/gif.latex?u%20%3D%20%5Csum%5Climits_%7Bi%3D1%7D%5En%20%28%5Bl_i%20%5Cle%20w%5D%20&plus;%20%5Br_i%20%5Cle%20w%5D%29%2Cv%20%3D%20%5Csum%5Climits_%7Bi%3D1%7D%5En%20%28%5Bl_i%20%3E%20w%5D%20&plus;%20%5Br_i%20%3E%20w%5D%29) 。 其中 ![](https://latex.codecogs.com/gif.latex?%5Cinline%20%5BX%5D) 当 ![](https://latex.codecogs.com/gif.latex?%5Cinline%20X) 成立时值为 1 ,否则为 0 。 我们显然要让 ![](https://latex.codecogs.com/gif.latex?%5Cinline%20%7Cu-v%7C) 的值尽量小,函数值才会小。 所以我们把所有的左右边界丢在一起排个序,取中间两个就是答案了。 ```cpp #include<iostream> #include<cstdio> #include<algorithm> using namespace std; int f[200100]; inline int read() { int x=0,f=1;char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();} return x*f; } int main() { freopen("linear.in","r",stdin);freopen("linear.out","w",stdout); int n=read(); for(int i=1;i<=n*2;i++) f[i]=read(); sort(f+1,f+2*n+1); cout<<f[n]<<" "<<f[n+1]<<endl; return 0; } ```