CF514
CF514A
简单题。当 \(9-t\le t\) 时交换一下即可。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define gc getchar
#define pc putchar
const int N=2e5+5;
const int M=1e7+5;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
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 n,m;
char c;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>c;int x=c-'0';
cout<<(char)(x^9&&9-x<x?9-x+'0':x+'0');
while(cin>>c){
int x=c-'0';
cout<<(char)(9-x<x?9-x+'0':x+'0');
}
return 0;
}
CF514B
对于斜率相同的点即在一条直线上,能一次干掉。特判 \(x=0\) 情况即可。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define gc getchar
#define pc putchar
const int N=2e5+5;
const int M=1e7+5;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
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 n,m,x0,y0;
inl int gcd(int a,int b){return !b?a:gcd(b,a%b);}
map<double,int>mp;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
n=read();x0=read();y0=read();
for(int i=1;i<=n;i++){
int x=read()-x0,y=read()-y0;
if(x)mp[1.0*y/x]=1;
else mp[inf]=1;
}
cout<<mp.size()<<endl;
return 0;
}
CF514C
把 \(n\) 个字符串塞到trie里,查询暴力dfs。
然而这复杂度真的是对的吗...可能是我太菜了
当然也可以hash 不过CF题就不写hash了吧
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define gc getchar
#define pc putchar
const int N=2e6+5;
const int M=1e7+5;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
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 n,m,t[N][4],cnt,num[N],len;
char s[N];
inl void insert(){
int len=strlen(s+1),p=0;
for(int i=1;i<=len;i++){
int x=s[i]-'a'+1;
p=t[p][x]?t[p][x]:t[p][x]=++cnt;
}
num[p]=1;
}
inl bool dfs(int k,int p,int ok){
if(k>len)return ok&num[p];
int x=s[k]-'a'+1,ans=0;
if(t[p][x])ans|=dfs(k+1,t[p][x],ok);
if(ans)return 1;
if(!ok){
for(int i=1;i<=3;i++){
if(x==i)continue;
if(t[p][i])ans|=dfs(k+1,t[p][i],1);
if(ans)return 1;
}
}
return 0;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
while(n--){
cin>>s+1;
insert();
}
while(m--){
cin>>s+1;
len=strlen(s+1);
cout<<(dfs(1,0,0)?"YES":"NO")<<endl;
}
return 0;
}
CF514D
枚举区间起始点,结尾可以二分找。
check就是 \(m\) 个区间分别找最大值 判加起来是否小于k
rmq可以用st表 复杂度 \(O(nm\log n)\)
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define int ll
#define gc getchar
#define pc putchar
const int N=1e5+5;
const int M=1e7+5;
const int inf=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+7;
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 n,m,kk,st[6][22][N],ans,res[N];
inl bool check(int l,int r){
int ans=0;
for(int i=1;i<=m;i++){
int k=__lg(r-l+1);
ans+=max(st[i][k][l],st[i][k][r-(1<<k)+1]);
}
return ans<=kk;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
n=read();m=read();kk=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
st[j][0][i]=read();
for(int i=1;i<=m;i++)
for(int k=1;k<=20;k++)
for(int j=1;j+(1<<k)-1<=n;j++)
st[i][k][j]=max(st[i][k-1][j],st[i][k-1][j+(1<<k-1)]);
for(int i=1;i<=n;i++){
int l=i,r=n,ret=i-1;
while(l<=r){
int mid=l+r>>1;
if(check(i,mid))l=mid+1,ret=mid;
else r=mid-1;
}
if(ret-i+1>ans){
ans=ret-i+1;int k=__lg(ret-i+1);
for(int j=1;j<=m;j++)
res[j]=max(st[j][k][i],st[j][k][ret-(1<<k)+1]);
}
}
for(int i=1;i<=m;i++)cout<<res[i]<<' ';
return 0;
}
CF514D
显然的dp式子:\(f_i\) 表示到根距离为 \(i\) 的点的数量
\(f_i=\sum\limits_{j=0}^n f_{i-d_j}\)
发现 \(d\) 很小 那么可以开桶统计 \(d_j\)
\(f_i=\sum\limits_{j=0}^{100} f_{i-j}\times t_j\)(\(t_j\) 表示 \(d_k=j\) 的数量)
可以用矩阵快快速幂加速
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define int ll
#define gc getchar
#define pc putchar
const int N=1e5+5;
const int M=1e7+5;
const int inf=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+7;
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 n,x,f[105],d[N],t[N],sum;
struct matrix{
int a[105][105];
}a;
inl void init_matrix(matrix &x){
for(int i=1;i<=101;i++)
for(int j=1;j<=101;j++)
x.a[i][j]=i==j;
}
inl void empty_matrix(matrix &x){
for(int i=1;i<=101;i++)
for(int j=1;j<=101;j++)
x.a[i][j]=0;
}
matrix operator*(matrix a,matrix b){
matrix ans;empty_matrix(ans);
for(int i=1;i<=101;i++)
for(int j=1;j<=101;j++)
for(int k=1;k<=101;k++)
ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j]%mod)%mod;
return ans;
}
inl void qpow(matrix &a,int b){
matrix ans;init_matrix(ans);
while(b){
if(b&1)ans=ans*a;
a=a*a;
b>>=1;
}
a=ans;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
n=read();x=read();f[0]=1;
if(x<=100){
for(int i=1;i<=n;i++)d[i]=read();
for(int i=1;i<=x;i++)
for(int j=1;j<=n;j++)
if(i-d[j]>=0)f[i]=(f[i]+f[i-d[j]])%mod;
for(int i=0;i<=x;i++)sum=(sum+f[i])%mod;
cout<<sum<<endl;
return 0;
}
for(int i=1;i<=n;i++)d[i]=read();
for(int i=1;i<=n;i++)t[d[i]]++;
for(int i=1;i<=100;i++)
for(int j=1;j<=n;j++)
if(i-d[j]>=0)f[i]=(f[i]+f[i-d[j]])%mod;
for(int i=0;i<=100;i++)sum=(sum+f[i])%mod;
a.a[1][1]=1;
for(int i=1;i<=100;i++)
a.a[i+1][1]=a.a[i+1][2]=t[i];
for(int i=3;i<=101;i++)
a.a[i-1][i]=1;
qpow(a,x-100);
int ans=sum*a.a[1][1]%mod;
for(int i=1;i<=100;i++)
ans=(ans+f[101-i]*a.a[i+1][1]%mod)%mod;
cout<<ans<<endl;
return 0;
}

浙公网安备 33010602011771号