sol 8
以下顺序按照难度给出
A:签到
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
#define endl "\n"
void solve(){
string s;
cin>>s;
LL n=s.size();
if(n!=8){
cout<<"Well-Being"<<endl;
return;
}
for(int i=0;i<8;i++){
if(si=='a'||si=='o'||si=='e'||si=='i'||si=='u'){
if(i%2==0){
cout<<"Well-Being"<<endl;
return;
}
}
else{
if(i%2==1){
cout<<"Well-Being"<<endl;
return;
}
}
}
cout<<"Suspected Virus"<<endl;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
LL T=1;
cin>>T;
while(T--){
solve();
}
}
E
前缀和预处理一下计算即可
签到
#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define endl '\n'
#define fi first
#define se second
#define dbg(x) cout<<#x<<" = "<<x<<endl;
#define dbg2(x,y) cout<<#x<<" = "<<x<<" "<<#y<<" = "<<y<<endl;
#define dbg3(x,y,z) cout<<#x<<" = "<<x<<" "<<#y<<" = "<<y<<" "<<#z<<" = "<<z<<endl;
#define forn for(int i=1;i<=n;i++)
#pragma GCC optimize(2)
using namespace std;
void solve(){
int n;
cin>>n;
vector<int>a(n+5),pre(n+5);
for(int i=1;i<=n;i++){
cin>>ai;
prei=prei-1+ai;
}
int ans=0;
for(int i=1;i<=n;i++){
int j=n-i;
int res=pren-prei;
res-=j*ai;
ans+=res;
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T=1;
//cin>>T;
while(T--){
solve();
}
return 0;
}
F:
提供一个跟标准答案不同的构造
注意到循环位移不会改变式子的值,我们可以直接将排列循环位移至k位为x
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
#define endl "\n"
LL ksm(LL a,LL n,LL mod){
LL res=1;
while(n){
if(n&1)res=res*a%mod;
n/=2;
a=a*a%mod;
}
return res%mod;
}
void solve(){
LL n,k,x;
cin>>n>>k>>x;
vector<LL>p(n+1);
vector<vector<LL>>t(n+1);
vector<LL>pos(n+1);
for(int i=0;i<n;i++){
cin>>pi;
posp\[i]=i;
}
vector<LL>ans(n+1);
LL sum=posx-k;
for(int i=0;i<n;i++){
ansi=p(i+sum+n)%n;
}
for(int i=0;i<n;i++)cout<<ansi<<" ";
cout<<endl;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
LL T=1;
//cin>>T;
while(T--){
solve();
}
}
G
诈骗题
不用管样例给出的立体图形,想象一根高度为1,半径为√2ϵ的圆柱,则对于底和顶上的元素而言,它们的距离近似为1
√ 1 +x2 ∼1+x2/2 ⇒√1+2ϵ≈1+ϵ
在高/底圆切/正方形密布放置即可
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
#define endl "\n"
LL ksm(LL a,LL n,LL mod){
LL res=1;
while(n){
if(n&1)res=res*a%mod;
n/=2;
a=a*a%mod;
}
return res%mod;
}
mt19937_64 rnd(time(0));
void solve(){
LL n;
cin>>n;
double k1=0.01,k2=0.011;
cout<<2*n<<endl;
LL cnt=0;
for(int i=0;i<ceil(sqrt(n));i++){
for(int j=0;j<ceil(sqrt(n));j++){
if(cnt==n)break;
cnt++;
double x=0.0+i*k2,y=0.0+j*k2,z=0;
cout<<fixed<<setprecision(10)<<x<<" "<<y<<" "<<z<<endl;
}
}
cnt=0;
for(int i=0;i<ceil(sqrt(n));i++){
for(int j=0;j<ceil(sqrt(n));j++){
if(cnt==n)break;
cnt++;
double x=0.0+i*k2,y=0.0+j*k2,z=1;
cout<<fixed<<setprecision(10)<<x<<" "<<y<<" "<<z<<endl;
}
}
//sqrt(1+r*r) sqrt(1+4*r*r)-1=k
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
LL T=1;
cin>>T;
while(T--){
solve();
}
}
J
大模拟
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
#define endl "\n"
LL ksm(LL a,LL n,LL mod){
LL res=1;
while(n){
if(n&1)res=res*a%mod;
n/=2;
a=a*a%mod;
}
return res%mod;
}
int ts=0;
vector<LL>cola(6),colb(6);
LL ca(vector<LL>&a,int k){
sort(a.begin(),a.end());
LL cnt=0,n=5,Pa=0;
if(k==0){
cnt=*max_element(cola.begin(),cola.end());
}
else{
cnt=*max_element(colb.begin(),colb.end());
}
if(cnt==5&&a0==10&&a1==11&&a2==12&&a3==13&&a4==14){
return 9;
}
// if(ts){
// for(int i=0;i<n;i++){
// cout<<ai<<" ";
// }
// cout<<endl;
// }
for(int i=0;i<1;i++){
int f=1;
for(int j=1;j<n;j++){
//if(a(i+j)%n==2&&a(i+j-1)%n==14)continue;
if(a(i+j)%n==a(i+j-1)%n+1)continue;
f=0;
}
if(f)Pa=4;
}
if(a0==2&&a1==3&&a2==4&&a3==5&&a4==14)Pa=4;
if(cnt==5){
if(Pa==4)Pa=8;
else Pa=5;
}
unordered_map<LL,LL>mp;
for(int i=0;i<n;i++)mpa\[i]++;
int f1=0,f2=0,f3=0;
for(autox,sum:mp){
if(sum==2)f1++;
if(sum==3)f2++;
if(sum==4)f3++;
}
if(f1&&f2)Pa=max(Pa,6ll);
if(f3)Pa=max(Pa,7ll);
if(f1==2)Pa=max(Pa,2ll);
if(f1==1)Pa=max(Pa,1ll);
if(f2)Pa=max(Pa,3ll);
return Pa;
}
bool cmp(LL a,LL b){
return a>b;
}
void solve(){
int n=5;
//cin>>n;
for(int i=0;i<6;i++)colai=0,colbi=0;
vector<vector<LL>>vis(60,vector<LL>(5));
unordered_map<char,LL>mp;
mp'S'=1,mp'C'=2,mp'D'=3,mp'H'=4;
mp'A'=14,mp'J'=11,mp'Q'=12,mp'K'=13;
mp'T'=10;
for(int i=2;i<=9;i++){
char c='2'+i-2;
mpc=i;
}
vector<LL>a1,b1;
for(int i=1;i<=4;i++){
string s;
cin>>s;
a1.push_back(mps\[0]);
colamp\[s\[1]]++;
vismp\[s\[0]]mp\[s\[1]]=1;
}
for(int i=1;i<=4;i++){
string s;
cin>>s;
b1.push_back(mps\[0]);
colbmp\[s\[1]]++;
vismp\[s\[0]]mp\[s\[1]]=1;
}
auto check=\&(vector<LL>&a,vector<LL>&b,int k)->LL{
sort(a.begin(),a.end());
sort(b.begin(),b.end());
if(k==9){
return 1;
}
else if(k==8||k==4){
int fa=0,fb=0;
for(int i=0;i<n;i++){
if(ai==2)fa=1;
if(fa&&ai==14)ai=1;
if(bi==2)fb=1;
if(fb&&bi==14)bi=1;
}
sort(a.begin(),a.end(),cmp);
sort(b.begin(),b.end(),cmp);
for(int i=0;i<n;i++){
if(ai>bi)return 2;
else if(ai<bi)return 0;
}
return 1;
}
else{
unordered_map<LL,LL>mp1,mp2;
for(int i=0;i<n;i++)mp1a\[i]++,mp2b\[i]++;
priority_queue<pair<LL,LL>>pq,pq1;
for(autox,cnt:mp1){
pq.push({cnt,x});
}
for(autox,cnt:mp2){
pq1.push({cnt,x});
}
LL cnt=0;
while(!pq.empty()){
autocnt1,x1=pq.top();
pq.pop();
autocnt2,x2=pq1.top();
pq1.pop();
cnt++;
if(x1>x2)return 2;
if(x2>x1)return 0;
}
//cout<<cnt<<" "<<a4<<" "<<a3<<endl;
return 1;
}
};
int f1=2;
for(int i=2;i<=14;i++){
for(int j=1;j<=4;j++){
if(visij)continue;
visij=1;
vector<LL>ta=b1;
ta.push_back(i);
colbj++;
int f=0,f2=0;
int pb=ca(ta,1);
for(int I=2;I<=14;I++){
f=0;
for(int J=1;J<=4;J++){
if(visIJ)continue;
colaJ++;
vector<LL>tb=a1;
tb.push_back(I);
int pa=ca(tb,0);
// cout<<pa<<" "<<pb<<endl;
if(pa>pb){
f=2;
colaJ--;
break;
}
if(pa==pb){
f=check(tb,ta,pa);
}
colaJ--;
}
f2=max(f2,f);
if(f2==2)break;
}
// if(f2==0)cout<<i<<" "<<j<<endl;
f1=min(f1,f2);
colbj--;
visij=0;
if(f1==0)break;
}
}
if(f1==0)cout<<"GeiWoCaPiXie"<<endl;
else if(f1==1)cout<<"PaiMeiYouWenTi"<<endl;
else cout<<"WoYaoYanPai"<<endl;
// for(int i=0;i<6;i++)cout<<colai<<" ";
// cout<<endl;
//cout<<*max_element(cola.begin(),cola.end())<<endl;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
LL T=1;
cin>>T;
while(T--){
solve();
}
}
C:
kruskal重构树+并查集
想清楚怎么维护其实不难
代码来自队友
#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define endl '\n'
#define fi first
#define se second
#define dbg(x) cout<<#x<<" = "<<x<<endl;
#define dbg2(x,y) cout<<#x<<" = "<<x<<" "<<#y<<" = "<<y<<endl;
#define dbg3(x,y,z) cout<<#x<<" = "<<x<<" "<<#y<<" = "<<y<<" "<<#z<<" = "<<z<<endl;
#define forn for(int i=1;i<=n;i++)
#pragma GCC optimize(2)
using namespace std;
const int N=250010;
int dx4={-1,1,0,0};
int dy4={0,0,-1,1};
int faN;
int visN;
int n,m,q;
int wN;
int mxN;
int lmN;
int aN;
int id(int x,int y){
return (x-1)*m+y;
}
int find(int x){
if(fax==x)return x;
int rt=find(fax);
lmx=max(lmx,lmfa\[x]);
return fax=rt;
}
void solve(){
cin>>n>>m>>q;
for(int i=1;i<=n*m;i++){
visi=0;
fai=i;
wi=0;
mxi=-1;
lmi=0;
ai=-1;
}
int l=0;
while(q--){
int op,xx,yy;
cin>>op>>xx>>yy;
int x=xx^l;
int y=yy^l;
int p=id(x,y);
visp=1;
if(op==1){
int v;
cin>>v;
ap=v;
wp=1;
mxp=v;
for(int d=0;d<4;d++){
int nx=x+dxd;
int ny=y+dyd;
if(nx<1||nx>n||ny<1||ny>m)continue;
int qid=id(nx,ny);
if(!visqid)continue;
int rv=find(qid);
if(rv!=p){
lmrv=max(lmrv,v-wrv+1);
farv=p;
wp+=wrv;
}
}
l=max(wfind(p)-1,0ll);
}
else{
find(p);
l=max(lmp-ap,0ll);
}
cout<<l<<"\n";
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T=1;
//cin>>T;
while(T--){
solve();
}
return 0;
}
H:
状态压缩dp+马尔可夫决策
1.因为每一轮手牌的状态变化仅跟双方的出牌/补牌有关,所以对于每种状态的每一种情况,我们可以预处理出它的nxt
2设Vt(s) 为当前状态 s、剩余t轮时Alice 的最大期望得分。
Vt(s) = max a: A.ca>0 min b: B.cb>0 payA(a,b) + 1 9 2 2 na=0 nb=0 Vt−1 s′(a,b,na,nb)
这个式子表示,对于每一种A的出牌,B取其得分最小的情况,而A取这些情况中最大的那一种
3.tips:期望dp特色:反向计算,dpi的i表示剩余i轮
4.马尔可夫决策:
不可约:由于每轮结束后双方独立随机补牌,从任意状态出发都可以在有 限步内以正概率到达任意其他状态;
非周期:返回同一状态的步数没有固定周期限制
故期望函数值的增长在极大收敛于同一常数;
该常数可通过1e4的增长期望求平均近似
5.对于1e4以下的数据,dp
对于1e4以上的数据,dp1e4+dt*g
code:
#include<bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f3f3f3f
#define GG ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define cnot cout<<"NO"<<"\n"
#define cyes cout<<"YES"<<"\n"
#define cans cout<<ans<<"\n"
#define pb push_back
#define x0 first
#define y0 second
#define lc p<<1
#define rc p<<1|1
#define mem(a,b) memset(a,b,sizeof(a))
#define sp(x) fixed<<setprecision(x)
#define all(v) v.begin(),v.end()
#define fr(i,st,ed) for(int i=st;i<=ed;i++)
#define ffr(i,st,ed,dt) for(int i=st;i<=ed;i+=dt)
using namespace std;
typedef pair<int,string>Pis;
typedef pair<int,int>Pii;
typedef pair<string,string>Pss;
const int N=2e4+10,mod=1e9+7,M=1e6+10;
int lowbit(int x){
return x&(-x);}
int nxt1053333;
double dp10005105;
int ID444;
struct Node{
int c3;
};
Node hand10;
bool WIN(int a,int b){
return (a==0&&b==1)||(a==1&&b==2)||(a==2&&b==0);
}
int PAY(int a,int b){
if(WIN(a,b))return 3;
if(a==b)return 1;
return 0;
}
void init(){
int idx=0;
fr(i,0,3){
fr(j,0,3-i){
int k=3-i-j;
handidx={{i,j,k}};
IDijk=idx++;
}
}
fr(i,0,9){
fr(j,0,9){
int s=i*10+j;
Node A=handi,B=handj;
fr(act,0,2){
fr(b,0,2){
fr(na,0,2){
fr(nb,0,2){
int ns=-1;
if(A.cact>0&&B.cb>0){
int nrA=A.c0-(act==0)+(na==0);
int nsA=A.c1-(act==1)+(na==1);
int npA=A.c2-(act==2)+(na==2);
int nrB=B.c0-(b==0)+(nb==0);
int nsB=B.c1-(b==1)+(nb==1);
int npB=B.c2-(b==2)+(nb==2);
if(nrA>=0&&nsA>=0&&npA>=0&&nrB>=0&&nsB>=0&&npB>=0){
ns=IDnrAnsAnpA*10+IDnrBnsBnpB;
}
}
nxtsactbnanb=ns;
}
}
}
}
}
}
}
double avg=0.0;
void DP(){
memset(dp,0.0,sizeof(dp));
fr(i,1,10000){
fr(j,0,9){
fr(k,0,9){
int s=j*10+k;
double Max=0;
bool f=0;
fr(a,0,2){
if(handj.ca==0)continue;
f=1;
double Min=inf;
fr(b,0,2){
if(handk.cb==0)continue;
int val=PAY(a,b);
double cst=0;
fr(na,0,2){
fr(nb,0,2){
int ns=nxtsabnanb;
if(ns!=-1)cst+=dpi-1ns;
}
}
double v=(double)val+(double)cst/9.0;
Min=min(Min,v);
}
Max=max(Max,Min);
}
if(f)dpis=Max;
}
}
}
fr(i,0,99)avg+=(dp10000i-dp9999i);
avg/=100.0;
}
void solve(){
int n;
cin>>n;
string str1,str2;
cin>>str1>>str2;
/*
int cnt13={0},cnt23={0};
fr(i,0,2){
cnt1i=count(all(str1),i+'R')+count(all(str1),i+'P')+count(all(str1),i+'S');
cnt2i=count(all(str2),i+'R')+count(all(str2),i+'P')+count(all(str2),i+'S');
}
int s1=IDcnt1\[0]cnt1\[1]cnt1\[2],s2=IDcnt2\[0]cnt2\[1]cnt2\[2];
*/
int ca3={0}, cb3={0};
for (char c : str1) { if(c=='R')ca0++; else if(c=='S')ca1++; else ca2++; }
for (char c : str2) { if(c=='R')cb0++; else if(c=='S')cb1++; else cb2++; }
int s1=IDca\[0]ca\[1]ca\[2];
int s2=IDcb\[0]cb\[1]cb\[2];
if(n<=10000){
cout<<sp(12)<<dpns1\*10+s2<<"\n";
return;
}
else{
int dt=n-10000;
double ans=dp10000s1\*10+s2+(double)dt*avg;
cout<<sp(12)<<ans<<"\n";
return;
}
}
signed main(){
GG;
init();
DP();
int _t=1;
cin>>_t;
while(_t--){
solve();
}
}
L
AC自动机优化/前后缀最大值/计数问题
(牛客的中文题解并不是很说人话,所以这是一个详细版本
首先,对于每个询问串,我们一定希望找出它在s中的位置,所以本题被分解成两个部分:找位置和计算
1.假设我们已经得到了每个询问串在s的具体位置p1,...,pm
所有好区间L,R 可划分为m个部分:
1 L∈1,p1, R ∈ p1 +\|t\|−1,n
2 L∈p1+1,p2, R ∈ p2 +\|t\|−1,n
3 ···
4 L∈pm−1+1,pm, R ∈ pm +\|t\|−1,n
这样可以保证至少包含1个t;
我们知道,val=prer-prel-1,想要极大化val,我们希望能够同时极大化prer和极小化prel-1,也就是需要我们去对pre做前缀最小值和后缀最大值
而对所有区间计数,求所有区间累加的具体方法为:
对于一个l,r,我们令上一段l,r的l为prev,令L表示prev-l-1的前缀和的累和,R表示r-n的前缀和的累和,左侧元素个数为cntL=l-prv,右侧元素个数为cntR=n-r+1;则完全包含该段区间的累和为R*cntL-L*cntR,这个通过手算其实很好验证;
其次,我们考虑寻找所有的子串位置,一个个压入kmp则一定超时,所以我们考虑AC自动机优化,
AC自动机的建立和模板基本上没有区别,唯一的优化是增加了up来优化fail指针的跳跃,具体的,我们希望在扫描s的时候,每经过一个字母都往上跳,寻找是否存在符合的以它为结尾的询问,但如果该节点对应的值未被记录则可以直接跳至它的fail指针处
而如果存在以当前指针为结尾的询问,则在该询问里加入当前位置
时间可行性则是:
相同长度的不同子串在S中的出现位置互不相同,因此同一个长度的查 询的出现位置个数之和是O(n),不同的查询串长度只有O(√T)种,总 复杂度是O(T|Σ|+n√T),其中 T= |t|,|Σ|=26 是字符集大小。
(都打多校了不会有人没学AC自动机吧。。。)
code:
#include<bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f3f3f3f
#define GG ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define cnot cout<<"NO"<<"\n"
#define cyes cout<<"YES"<<"\n"
#define cans cout<<ans<<"\n"
#define pb push_back
#define x0 first
#define y0 second
#define lc p<<1
#define rc p<<1|1
#define mem(a,b) memset(a,b,sizeof(a))
#define sp(x) fixed<<setprecision(x)
#define all(v) v.begin(),v.end()
#define fr(i,st,ed) for(int i=st;i<=ed;i++)
#define ffr(i,st,ed,dt) for(int i=st;i<=ed;i+=dt)
using namespace std;
typedef pair<int,string>Pis;
typedef pair<int,int>Pii;
typedef pair<string,string>Pss;
const int N=3e5+10,mod=998244353,M=1e6+10;
int lowbit(int x){
return x&(-x);}
int qnodeN;
struct AC{
int nxtN26,failN,L,root;
int upN,lenN;
int newnode(){
memset(nxtL,-1,sizeof(nxtL));
upL=-1;
lenL=0;
return L++;
}
void init(){
L=0;
root=newnode();
}
void ist(string s,int id){
int now=root;
for(int i=0;i<s.size();i++){
int c=si-'a';
if(nxtnowc==-1)
nxtnowc=newnode();
now=nxtnowc;
}
qnodeid=now;
lennow=s.size();
}
void build(){
queue<int>Q;
failroot=root;
for(int i=0;i<26;i++){
if(nxtrooti==-1)
nxtrooti=root;
else{
failnxt\[rooti]=root;
Q.push(nxtrooti);
}
}
while(!Q.empty()){
int u=Q.front();
Q.pop();
for(int i=0;i<26;i++){
if(nxtui==-1)
nxtui=nxtfail\[u]i;
else{
failnxt\[ui]=nxtfail\[u]i;
Q.push(nxtui);
}
}
upu=lenfail\[u]?failu:upfail\[u];
}
}
}ac;
int PN,preN,sumPN,prefminN,sufmaxN;
int SUM(int l,int r){
if(l>r)return 0;
return (sumPr-sumPl-1+mod)%mod;
}
int QMOD(int x){
x%=mod;
return x<0?x+mod:x;
}
vector<int>posN;
bool visN;
int MAXN,SUMSN;
void solve(){
int n,q;
cin>>n>>q;
string S;
cin>>S;
S=" "+S;
fr(i,1,n){
cin>>Pi;
prei=prei-1+Pi;
}
prefmin0=pre0;
fr(i,1,n){
prefmini=min(prefmini-1,prei);
}
sufmaxn=pren;
for(int i=n-1;i>=1;i--){
sufmaxi=max(sufmaxi+1,prei);
}
fr(i,1,n){
sumPi=QMOD(sumPi-1+prei);
}
ac.init();
fr(i,1,q){
string s;
cin>>s;
ac.ist(s,i);
}
ac.build();
int now=ac.root;
fr(i,1,n){
now=ac.nxtnowS\[i-'a'];
for(int j=now;j;j=ac.upj){
if(ac.lenj){
posj.pb(i-ac.lenj+1);
}
}
}
fr(i,1,q){
int Pos=qnodei;
if(visPos){
cout<<MAXPos<<" "<<SUMSPos<<"\n";
continue;
}
visPos=1;
int Max=-inf,Sum=0;
for(int x:posPos){
int l=x,r=x+ac.lenPos-1;
int val=sufmaxr-prefminl-1;
Max=max(Max,val);
}
MAXPos=Max;
int sz=posPos.size();
for(int k=0,prv=0;k<sz;k++){
int l=posPosk,r=l+ac.lenPos-1;
int L=QMOD(SUM(prv,l-1));
int R=QMOD(SUM(r,n));
int cntL=l-prv,cntR=n-r+1;
Sum=(Sum+QMOD(R*cntL-L*cntR)+mod)%mod;
Sum=QMOD(Sum);
prv=l;
}
SUMSPos=(Sum+mod)%mod;
cout<<Max<<" "<<SUMSPos<<"\n";
}
}
signed main(){
GG;
int _t=1;
//cin>>_t;
while(_t--){
solve();
}
}