CF1846
CF1846A
考虑每根绳子是否影响糖果落地 显然 若高度-绳子长度>0 绳子会拽着糖果不让它落地 ans++即可
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define int ll
#define gc getchar
#define pc putchar
const int N=1e5+5;
const int M=1e8+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
inl int read(){
int x=0,f=1;char c=gc();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return x*f;
}
inl void write(int x){
if(x<0){pc('-');x=-x;}
if(x>9)write(x/10);
pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int t,n,a,b,ans;
signed main(){
t=read();
while(t--){
n=read();ans=0;
while(n--){
a=read();b=read();
if(a-b>0)ans++;
}
writel(ans);
}
return 0;
}
CF1846B
模拟。
可能是答案的有三行三列和两个对角线,分别判断即可。
记得把里面的"."判掉
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define int ll
#define gc getchar
#define pc putchar
const int N=1e5+5;
const int M=1e8+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
inl int read(){
int x=0,f=1;char c=gc();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return x*f;
}
inl void write(int x){
if(x<0){pc('-');x=-x;}
if(x>9)write(x/10);
pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int t,vis[10];
char c[5][5];
signed main(){
t=read();
while(t--){
int flag=0;
memset(vis,0,sizeof(vis));
for(int i=1;i<=3;i++)
scanf("%s",c[i]+1);
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
if(c[i][j]=='.'){
vis[i]=vis[3+j]=1;
if(i==j)vis[7]=1;
if(i+j==4)vis[8]=1;
}
}
}
for(int i=1;i<=3;i++)
if(!vis[i]&&c[i][1]==c[i][2]&&c[i][2]==c[i][3]){pc(c[i][1]);pc('\n');flag=1;break;}
if(flag)continue;
for(int i=1;i<=3;i++)
if(!vis[i+3]&&c[1][i]==c[2][i]&&c[2][i]==c[3][i]){pc(c[1][i]);pc('\n');flag=1;break;}
if(flag)continue;
if(!vis[7]&&c[1][1]==c[2][2]&&c[2][2]==c[3][3]){pc(c[1][1]);pc('\n');continue;}
if(!vis[8]&&c[1][3]==c[2][2]&&c[2][2]==c[3][1]){pc(c[1][3]);pc('\n');continue;}
puts("DRAW");
}
return 0;
}
CF1846C
贪心+模拟。
先写罚时少的题一定更优,那么先把完成时间排序,一道道判断是否能做完即可。
注意罚时时间是从比赛开始到完成。
如果2~n中有选手分更多/同分更快 那么rk++
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define int ll
#define gc getchar
#define pc putchar
const int N=2e5+5;
const int M=1e8+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
inl int read(){
int x=0,f=1;char c=gc();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return x*f;
}
inl void write(int x){
if(x<0){pc('-');x=-x;}
if(x>9)write(x/10);
pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int t,n,m,h,a[N],pts,tim,ttim,mp,mt,mtt,rk;
signed main(){
t=read();
while(t--){
n=read();m=read();h=read();rk=1;pts=tim=ttim=0;
for(int i=1;i<=m;i++)a[i]=read();
sort(a+1,a+m+1);
for(int i=1;i<=m&&a[i]+ttim<=h;i++)
pts++,tim+=a[i]+ttim,ttim+=a[i];
for(int k=2;k<=n;k++){
mp=mt=mtt=0;
for(int i=1;i<=m;i++)a[i]=read();
sort(a+1,a+m+1);
for(int i=1;i<=m&&a[i]+mtt<=h;i++)
mp++,mt+=a[i]+mtt,mtt+=a[i];
rk+=(mp>pts||(mp==pts&&mt<tim));
}
writel(rk);
}
return 0;
}
CF1846D
初中数学题。
先把所有三角形面积相加,再减去重叠面积即可
然后根据初中所学:
相似三角形面积比等于相似比平方
\(\dfrac{s_1}{s}=\dfrac{y_2+h-y_1}{h}\)
\(s_1=\dfrac{y_2+h-y_1}{h}\times s\)
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define int ll
#define gc getchar
#define pc putchar
const int N=2e5+5;
const int M=1e8+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
const double eps=1e-8;
inl int read(){
int x=0,f=1;char c=gc();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return x*f;
}
inl void write(int x){
if(x<0){pc('-');x=-x;}
if(x>9)write(x/10);
pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int t,n,d,h,y,yy;
double ans,s;
signed main(){
t=read();
while(t--){
n=read();d=read();h=read();
s=d*h/2.0,ans=n*s;
yy=read();
for(int i=1;i<=n-1;i++){
y=yy,yy=read();
if(y+h<=yy)continue;
ans-=((y+h-yy)/(double)h)*((y+h-yy)/(double)h)*s;
}
printf("%.8f\n",ans);
}
return 0;
}
CF1846E1 CF1846E2
问题:求满足 \(n=1+k+k^2+...+k^q\) 的 \(n\) \((k>1,q>1)\)
考虑simple版的情况:\(n\le 10^6\)
直接暴力枚举 \(k,q\) 答案存到桶里即可
hard版 \(n\le 10^{18}\)
暴力枚举 \(k\) 需要枚举到 \(\sqrt n=10^9\) 复杂度显然会炸
考虑对于 \(k\in [\sqrt[3]{n},\sqrt n]\) \(\ 1+k+k^2+k^3\) 显然大于 \(10^{18}\) 那么只可能是 \(1+k+k^2\)
那么可以根号分治:
- 对于 \(k\in [2,\sqrt[3]{n}-1]\) 暴力枚举 桶开不下可以用map
- 对于 \(k\in [\sqrt[3]{n},\sqrt n]\) 直接求解 \(1+k+k^2=n\) 显然具有单调性 二分答案即可
运算过程可能炸 long long 需要开 __int128
(CF的c++14不支持__int128 会CE 建议开c++17)
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define int __int128
#define gc getchar
#define pc putchar
const int N=2e5+5;
const int M=1e8+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
const double eps=1e-8;
inl int read(){
int x=0,f=1;char c=gc();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return x*f;
}
inl void write(int x){
if(x<0){pc('-');x=-x;}
if(x>9)write(x/10);
pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int t,n;
map<int,bool>mp;
inl bool check(int x){return x*x+x+1>=n;}
signed main(){
for(int k=2;k<=1e6;k++){
int res=k+1,poww=k*k;
while(res+poww<=1e18){
res+=poww;
mp[res]=1;poww*=k;
}
}
t=read();
while(t--){
n=read();
if(mp[n])puts("YES");
else{
int l=1e6,r=1e9,ans=0;
while(l<=r){
int mid=l+r>>1;
if(check(mid)){
if(mid*mid+mid+1==n){ans=1;break;}
r=mid-1;
}
else l=mid+1;
}
if(ans)puts("YES");
else puts("NO");
}
}
return 0;
}
CF1846G
一道差不多的网络流24题:P2761
注意到 \(n\) 很小,考虑状压
把所有状态当做点,所有药当做边,跑dij即可
连边时对于每个状态 \(i\),向 \(\text{(i-(i&a))|b}\) 连一条长为d的边
- \(\text{i&a}\):药能治好的病
- \(\text{i-(i&a)}\):药治不好的病
- \(\text{(i-(i&a))|b}\):药治不好的病+后遗症
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define gc getchar
#define pc putchar
const int N=2e6+5;
const int M=1e8+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
const double eps=1e-8;
inl int read(){
int x=0,f=1;char c=gc();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return x*f;
}
inl void write(int x){
if(x<0){pc('-');x=-x;}
if(x>9)write(x/10);
pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int t,n,m,s;
char c;
int head[N],nxt[N],to[N],w[N],cnt,a[N],b[N],d[N];
inl void add(int u,int v,int c){
nxt[++cnt]=head[u];
to[cnt]=v;w[cnt]=c;
head[u]=cnt;
}
inl void init(int n){
memset(a,0,sizeof a);
memset(b,0,sizeof b);
for(int i=0;i<(1<<n);i++){
int x=head[i];head[i]=0;
while(x){
to[x]=0;w[x]=0;
int y=x;
x=nxt[x];nxt[y]=0;
}
}
cnt=0;
}
int dis[N],vis[N];
inl void dij(int s){
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
memset(dis,0x3f,sizeof dis);
memset(vis,0,sizeof vis);
dis[s]=0;q.push({0,s});
while(!q.empty()){
int x=q.top().second;q.pop();
if(vis[x])continue;vis[x]=1;
for(int i=head[x];i;i=nxt[i]){
int y=to[i],c=w[i];
if(dis[y]>dis[x]+c){
dis[y]=dis[x]+c;
if(!vis[y])q.push({dis[y],y});
}
}
}
}
signed main(){
t=read();
while(t--){
init(n);
n=read();m=read();s=0;
for(int i=n-1;~i;i--){
scanf(" %c",&c);
s+=((c-'0')<<i);
}
for(int i=1;i<=m;i++){
d[i]=read();
for(int j=n-1;~j;j--){
scanf(" %c",&c);
a[i]+=((c-'0')<<j);
}
for(int j=n-1;~j;j--){
scanf(" %c",&c);
b[i]+=((c-'0')<<j);
}
}
for(int i=0;i<(1<<n);i++){
for(int j=1;j<=m;j++){
add(i,(i-(i&a[j]))|b[j],d[j]);
}
}
dij(s);
writel(dis[0]^inf?dis[0]:-1);
}
return 0;
}