msjing在模拟赛的神之代码
26.7.9
T2之徒手算数
#include<bits/stdc++.h>
using namespace std;
constexpr int maxn=3010;
long long read() {long long x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch-'0');ch=getchar();}return x*f;}
int n;
void tp2(int a1,int a2,int b1,int b2)
{
if (a1)
{
if (a2)
{
if (b1)
{
if (b2) printf("0\n");
else printf("1\n");
}
else
{
if (b2) printf("1\n");
else printf("2\n");
}
}
else
{
if (b1)
{
if (b2) printf("1\n");
else printf("2\n");
}
else
{
if (b2) printf("3\n");
else printf("3\n");
}
}
}
else
{
if (a2)
{
if (b1)
{
if (b2) printf("1\n");
else printf("3\n");
}
else
{
if (b2) printf("2\n");
else printf("4\n");
}
}
else
{
if (b1)
{
if (b2) printf("2\n");
else printf("4\n");
}
else
{
if (b2) printf("3\n");
else printf("You have no egg!");
}
}
}
}
int a[maxn][maxn];
bool f[maxn];
int main()
{
freopen("fountain.in","r",stdin);
freopen("fountain.out","w",stdout);
n=read();
if (n == 1)
{
int x=read();
if (x) printf("0\n");
else printf("You have no egg!");
}
else if (n == 2)
{
string s;
for (int i=1;i<=n;i++)
{
cin >> s;
for (int j=1;j<=n;j++) a[i][j]=s[j-1]-'0';
}
tp2(a[1][1],a[1][2],a[2][1],a[2][2]);
}
else
{
string s;
for (int i=1;i<=n;i++)
{
cin >> s;
for (int j=1;j<=n;j++) {a[i][j]=s[j-1]-'0';if (!a[i][j]) f[i]=1;}
}
int F=0;
for (int i=1;i<=n;i++) if (!f[i]) F=1;
if (F)
{
int k=0;
for (int j=1;j<=n;j++)
{
int fl=1;
for (int i=1;i<=n;i++) if (!a[i][j]) fl=0;
if (fl) k++;
}
printf("%d\n",n-k);
}
else printf("You have no egg!");
}
return 0;
}
T3之五层循环
#include<bits/stdc++.h>
using namespace std;
constexpr int maxn=3010;
long long read() {long long x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch-'0');ch=getchar();}return x*f;}
int p,n,m;
long long ksm(long long x,long long y)
{
long long res=1;
while (y)
{
if (y&1) (res*=x)%=p;
(x*=x)%=p;
y>>=1;
}
return res;
}
struct shi_shan_code
{
int s[maxn];
void cl()
{
for (int i=0;i<n*m;i++) s[i]=0;
}
void init1()
{
for (int a=0;a<=m;a++) s[a]++;
}
void init2()
{
for (int a=0;a<=m;a++)
for (int b=0;b<=m;b++) s[a+b]++;
}
void init3()
{
for (int a=0;a<=m;a++)
for (int b=0;b<=m;b++)
for (int c=0;c<=m;c++) s[a+b+c]++;
}
void init4()
{
for (int a=0;a<=m;a++)
for (int b=0;b<=m;b++)
for (int c=0;c<=m;c++)
for (int d=0;d<=m;d++) s[a+b+c+d]++;
}
void init5()
{
for (int a=0;a<=m;a++)
for (int b=0;b<=m;b++)
for (int c=0;c<=m;c++)
for (int d=0;d<=m;d++)
for (int e=0;e<=m;e++) s[a+b+c+d+e]++;
}
}ss;
int main()
{
freopen("pr.in","r",stdin);
freopen("pr.out","w",stdout);
p=read();
int T=read();
while (T--)
{
n=read(),m=read();
ss.cl();
if (n == 1) ss.init1();
else if (n == 1) ss.init2();
else if (n == 3) ss.init3();
else if (n == 4) ss.init4();
else if (n == 5) ss.init5();
// for (int i=0;i<=m*n;i++) printf("%.3lf ",ss.s[i]);
// cerr << endl;
// for (int i=1;i<=m*n;i++) cerr << S[i] << " ";
double tot=ksm(m+1,n*2)*1.0;
// cerr << tot << endl;
// for (int i=0;i<=n*m;i++) ss.s[i]/=tot;
// for (int i=0;i<=m*n;i++) printf("%.3lf ",ss.s[i]);
// cerr << endl;
double ans=0;
for (int i=1;i<=m*n;i++)
{
int t=0;
for (int j=0;j<i;j++) t+=ss.s[j];
// cerr << t << endl;
// printf("%.3lf ",t);
ans+=1.0*ss.s[i]*t;
}
// cerr << ans << endl;
// cerr << endl;
ans*=p;ans/=tot;
printf("%.0lf\n",ans);
}
return 0;
}
/*
998244353
1
3 4
*/
/*
787878
1
25 25
*/
/*
998244353
1
1 2
*/
/*
998244353
2
1 2
3 4
*/
- 总结:热衷于 \(have\) \(no\) \(egg\)
26.7.14
T4之只能过样例
#include<bits/stdc++.h>
#define int long long
using namespace std;
constexpr int maxn=2e6+10;
int read()
{
int x=0,f=1;
char ch=getchar();
while (ch<'0' || ch>'9')
{
if (ch == '-') f=-1;
ch=getchar();
}
while (ch>='0' && ch<='9')
{
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*f;
}
int n,m,root;
struct _ {int l,r,sum,lz,ls,rs;}tr[maxn];
int h[maxn],to[maxn],nxt[maxn],tot;
void add(int x,int y) {tot++,to[tot]=y,nxt[tot]=h[x],h[x]=tot;}
void Build(int x)
{
int l1=0,r1=0,l2=0,r2=0,lson=0,rson=0;
for (int i=h[x];i;i=nxt[i])
{
int y=to[i];
Build(y);
if (l1 && r1) l2=tr[y].l,r2=tr[y].r,rson=y;
else l1=tr[y].l,r1=tr[y].r,lson=y;
}
if (!l1 && !r1 && !l2 && !r2 && !lson && !rson) return tr[x].l=tr[x].r=x,void();
else
{
// cerr << l1 << " " << r1 << " " << l2 << " " << r2 << endl;
if (l1>l2) swap(l1,l2),swap(r1,r2),swap(lson,rson);
tr[x].l=l1,tr[x].r=r2,tr[x].ls=lson,tr[x].rs=rson;
}
// cerr << x << " " << tr[x].l << " " <<tr[x].r << endl;
}
//void Pushup(int x) {tr[x].sum=tr[tr[x].ls].sum+tr[tr[x].rs].sum;}
void Upd(int x,int l,int r,int val)
{
// cout << x << " " << l << " " << r << endl;
// cout << x << " " << l << " " << tr[x].l << " " << r << " " << tr[x].r << endl;
if (l == tr[x].l && tr[x].r == r) return tr[x].sum=val*(r-l+1),void();
// cout << "x:" << x << endl;
// cout << l << " " << tr[tr[x].ls].r << endl;
// cout << r << " " << tr[tr[x].rs].l << endl;
if (l<=tr[tr[x].ls].r) Upd(tr[x].ls,l,tr[tr[x].ls].r,val);
if (r>=tr[tr[x].rs].l) Upd(tr[x].rs,tr[tr[x].rs].l,r,val);
// Pushup(x);
// cout << "chk:";
// cout << x << " " << tr[x].sum << endl;
}
int query(int x,int l,int r)
{
int res=0;
if (l == tr[x].l && tr[x].r == r) return tr[x].sum;
if (l<=tr[tr[x].ls].r) res+=query(tr[x].ls,l,tr[tr[x].ls].r);
if (r>=tr[tr[x].rs].l) res+=query(tr[x].rs,tr[tr[x].rs].l,r);
return res;
}
int v[maxn];
signed main()
{
n=read(),m=read();
for (int i=1;i<n;i++)
{
int l=read(),r=read();
v[l]=1,v[r]=1;
add(n+i,l),add(n+i,r);
}
for (int i=1;i<=2*n-1;i++) if (!v[i]) {root=i;break;}
Build(root);
while (m--)
{
int op=read();
if (op == 1)
{
int l=read(),r=read(),k=read();
Upd(root,l,r,k);
}
else
{
int l=read(),r=read();
// printf("%d\n",tr[2].sum+tr[3].sum+tr[4].sum);
printf("%lld\n",query(root,l,r));
}
}
return 0;
}
/*bug
5 6
4 5
3 6
1 2
8 7
1 1 5 1
9 1 5
2 2 3
0
2 1 5
5
1 2 5 3
9 2 5
8 2 3
2 2 3
7 4 5
3 4 4
0 4 4
0 1 4
0 1 4
*/
/*
5 6
4 5
3 6
1 2
8 7
*/
/*
5 6
4 5
3 6
1 2
8 7
1 1 5 1
2 2 3
2 1 5
1 2 5 3
2 2 4
2 3 5
*/
26.6.16
T3尝试骗分
#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
constexpr int maxn=1e6+10;
int read()
{
int x=0,f=1;
char ch=getchar();
while (ch<'0' || ch>'9')
{
if (ch == '-') f=-1;
ch=getchar();
}
while (ch>='0' && ch<='9')
{
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*f;
}
int n,m;
int h[maxn],to[maxn],nxt[maxn],tot;
void addedge(int x,int y)
{
tot++;
to[tot]=y;
nxt[tot]=h[x];
h[x]=tot;
}
int a[maxn];
int v[maxn];
void dfs(int x,int fa)
{
if (x == n) x=1;
for (int i=h[x];i;i=nxt[i])
{
int y=to[i];
if (y == fa) continue;
v[y]=1;
dfs(y,x);
}
}
signed main()
{
freopen("delta.in","r",stdin);
freopen("delta.out","w",stdout);
n=read(),m=read();
for (int i=1;i<=m;i++)
{
int x=read(),y=read();
addedge(x,y),addedge(y,x);
}
if (n == m+1)
{
v[1]=1;
dfs(1,0);
int f=1;
for (int i=1;i<=n;i++)
if (!v[i]) f=0;
if (f) puts("AC");
else puts("WA");
}
else puts("WA");
return 0;
}
26.8.17
T3 $O(n^7)$ 暴力 $\to$ $20pts$
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
constexpr int maxn=1e6+10;
string a,b,c;
int la,lb,lc;
int chk(string s)
{
int len=s.size();
s=" "+s;
int l,r;
if (len%2) l=r=len/2+1;
else l=len/2,r=len/2+1;
while (l>=1 && r<=len)
{
if (s[l]!=s[r]) return 0;
l--,r++;
}
return 1;
}
int main()
{
freopen("palindrome.in","r",stdin);
freopen("palindrome.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int T;cin >> T;
while (T--)
{
int ans=0;
cin >> a >> b >> c;
la=a.size(),lb=b.size(),lc=c.size();
for (int al=0;al<la;al++)
for (int ar=al;ar<la;ar++)
for (int bl=0;bl<lb;bl++)
for (int br=bl;br<lb;br++)
for (int cl=0;cl<lc;cl++)
for (int cr=cl;cr<lc;cr++)
{
string aa,bb,cc,k;
for (int i=al;i<=ar;i++) aa+=a[i];
for (int i=bl;i<=br;i++) bb+=b[i];
for (int i=cl;i<=cr;i++) cc+=c[i];
// cerr << aa << endl;
// cerr << bb << endl;
// cerr << cc << endl;
k=aa+bb+cc;
// cerr << k << endl;
// cerr << chk(k) << endl;
if (chk(k)) ans++;
}
cout << ans << endl;
}
return 0;
}
/*O(n^7) to solve*/
/*except ok of subtack1*/
/*except 20pts*/
/*2000ms to solve n=1000
maybe std use O(n^3 \log n) to solve*/
26.9.21
- T4之分块搓不出来
#include<bits/stdc++.h>
#define int long long
#define pb push_back
using namespace std;
constexpr int maxn=2e5+10;
int read()
{
int x=0,f=1;
char ch=getchar();
while (ch<'0' || ch>'9')
{
if (ch == '-') f=-1;
ch=getchar();
}
while (ch>='0' && ch<='9')
{
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*f;
}
int n;
int h[maxn<<1],to[maxn<<1],nxt[maxn<<1],tot;
int p[maxn];
void addedge(int x,int y)
{
tot++;
to[tot]=y;
nxt[tot]=h[x];
h[x]=tot;
}
int jud(int x,int fa,int tt)
{
for (int i=h[x];i;i=nxt[i])
{
int y=to[i];
if (y == fa) continue;
if (y!=p[tt]) return 0;
return jud(y,x,tt+1);
}
return 1;
}
void subtask2()
{
int ans=0;
for (int i=1;i<=n;i++)
ans+=i;
printf("%lld\n",ans);
}
vector<int> son[maxn];
int L[maxn],R[maxn],pos[maxn],cnt;
int f[450];/*Its meaning is "The ans in a sqrt"*/
int g[450][450];/*sqrt to sqrt*/
int bu[450][maxn];/*in sqrt of edge*/
void init()
{
cnt=sqrt(n);
for (int i=1;i<=cnt;i++)
L[i]=R[i-1]+1,R[i]=cnt*i;
if (R[cnt]<n)
cnt++,L[cnt]=R[cnt-1]+1,R[cnt]=n;
for (int i=1;i<=cnt;i++)
for (int j=L[i];j<=R[i];j++)
pos[j]=i;
/*Now start to solve in sqrt*/
vector<int> point;
int t[maxn];
for (int i=1;i<=cnt;i++)
{/*O(sqrt)*/
point.clear();/*O(sqrt)*/
int j=L[i];
while (j<=R[i])
{/*O(sqrt)*/
if (!point.size())
{
f[i]++;
point.pb(p[j]);
continue;
}
int F=0;
for (int k:point)
{/*O(sqrt)*/
auto id=lower_bound(point.begin(),point.end(),p[j]);
/*O(log)*/
if (id!=point.end())
{
F=1;
t[k]++,t[p[j]]++;
if (t[k]>2 || t[p[j]]>2) {F=0;break;}
/*if a point's edge > 2,
fail,can't add,break*/
}
}
if (!F)
{
// cerr << "chk !F:";
// cerr << i << " " << f[i] << endl;
point.clear();
for (int k=L[i];k<=j;k++)
t[p[k]]=0;
}
/*p[j] isn't any point's son or fail,
so the ans is max,ok to break*/
f[i]++,point.pb(p[j]);
j++;
/*ans can +1,add p[j]*/
}
for (int j=L[i];j<=R[i];j++)
bu[i][p[j]]=t[p[j]],t[p[j]]=0;
/*clear bucket,O(sqrt)*/
}
/*solve of it O(n sqrt log),solve over*/
/*Now start to solve (sqrt to sqrt)'s ans*/
for (int i=1;i<=cnt;i++)
{
point.clear();
int flag=1;
for (int j=L[i];j<=R[i];j++)
{
point.pb(p[j]);
t[p[j]]=bu[i][p[j]];
if (t[p[j]]>2) {flag=0;break;}
}
if (!flag) break;
/*in sqrt is fail,also sqrt to sqrt is fail*/
for (int j=i+1;j<=n;j++)
{
int F=0;
int num=0;
for (int k=L[j];k<=R[j];k++)
{
if (!point.size())
{
num++;
point.pb(p[k]);
continue;
}
for (int z:point)
{
auto id=lower_bound(point.begin(),point.end(),p[k]);
if (id!=point.end())
{
F=1;
t[z]++,t[p[k]]++;
if (t[z]>2 || t[p[k]]>2) {F=0;break;}
}
}
if (!F) break;
num++,point.pb(p[k]);
}/*same in sqrt*/
if (!F) break;
/*if this sqrt is fail,
can't add for sqrt which behind it,
so break*/
g[i][j]+=num+f[j];
/*ok to add this sqrt ans*/
}
for (int j=L[i];j<=n;j++)
t[p[j]]=0;
}
}
signed main()
{
// freopen("patrol.in","r",stdin);
// freopen("patrol.out","w",stdout);
n=read();
for (int i=1;i<n;i++)
{
int x=read(),y=read();
addedge(x,y);
addedge(y,x);
son[x].pb(y),son[y].pb(x);
}
for (int i=1;i<=n;i++)
p[i]=read();
if (jud(p[1],0,2)) return subtask2(),0;
init();
for (int i=1;i<=cnt;i++)
cerr << f[i] << " ";
cerr << endl;
for (int i=1;i<=cnt;i++)
{
for (int j=i+1;j<=cnt;j++)
cerr << g[i][j] << " ";
cerr << endl;
}
if (g[1][n]) printf("%lld\n",g[1][n]);
else
{
int id=0;
for (int i=cnt;i>=1;i--)
if (g[1][i])
{id=i;break;}
int ans=g[1][id];
for (int i=id+1;i<=n;i++)
ans+=f[i];
printf("%lld\n",ans);
}
return 0;
}
$\mathscr{msjing}$

浙公网安备 33010602011771号