2023NOIP游记
我看看有多少人吊打我
Day -1:
复习了ST表,线段树,KMP,LCA,结果,一个都没考!!
Day 0:
再次复习,好像都会了,又好像都不会,思考了考场策略,然后就躺倒床上了。
Day 1:
六点半才起来,再复习了一下。
吃完早餐直奔yh。
-
7:30 来到了yh,一个人也没有,过了一会,z老师来咯,祝福了我然后就送我进考(xing)场。
-
8:00 跟 @hzlqwq 大佬一个考场,膜拜了一通,他却虚心地说只能做T1。
【T1】
- 8:30 终于开始了。。。
- 8:31 哇,T1 好水,直接开切。
- 9:30 为什么
阳历都过不了?什么奇怪的东西?我甚至手玩了大样例 - 10:00 不对啊,我的程序对的啊,为啥阳历过不了?
- 10:10 重新看题:\(w'_i\) 看成了 \(w_i\)。。啊啊,难受啊。没事,只需要再维护最大值就好了。
- 10:15好吧,大样例过了,呃?大样例4s?不行,得卡常,卡卡卡卡,到了3s,卡不下去了。没事,这是i3-8,CCF 老爷机好歹是 i7-8 + O2。希望能过。。。
#include <bits/stdc++.h>
using namespace std;
const int N = 3005;
int n,m;
pair<string,int> s[N];
int tt[35];
string s2[N];
bool check(int x){
if(s2[s[x].second] < s[1].first || (x==1 && s2[s[x].second] < s[2].first)) return true;
else return false;
}
bool cmp(pair<string,int> x,pair<string,int> y){
return x.first<y.first;
}
int vis[N];
char ch[N];
string ru[N];
int main(){
freopen("dict.in","r",stdin);
freopen("dict.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i =1;i <= n;i++) {
scanf("%s",ch);
ru[i]=ch;
}if(n==1){
cout<<1;
exit(0);
}
for(int x = 1;x <= n;++x){
memset(tt,0,sizeof tt);
for(int i = 0 ;i < m;++i) tt[ru[x][i]-'a'] ++;
string ans,ans2;
for(int i=25;i >= 0;--i){
int y=tt[i];
while(tt[i]--) ans=ans+char(i+'a');
tt[i]=y;
}s[x].first = ans;
for(int i=0;i <= 25;++i){
while(tt[i]--) ans2=ans2+char(i+'a');
}s2[x]=ans2;
}
for(int i = 1;i <= n;i++) s[i].second=i;
sort(s+1,s+1+n,cmp);
for(int i = 1;i <= n;i++){
if(check(i))vis[s[i].second]=1;
}for(int i = 1;i <= n;i++) printf("%d",vis[i]);
return 0;
}
【T2】
- 10:40 试图思考正解,我在草稿纸上写了三个大字——并查集(
结果没写出来,赛后dalao们说这是正解,警钟长鸣)。。但是发现不会了。。。。于是思考线性解法,发现不会啊,贪心?不会,DP?不会。不行啊,启动暴力吧。 - 10:50 DFS面向数据写完,20pts 到手
- 11:15 特殊数据点,20pts 到手
- 11:20 开始进军接下来的 20pts。发现我的结论假了。
- 11:40 实在想不出来,过//开后两题。
#include <bits/stdc++.h>
using namespace std;
int c,t;
int n,m;
const int N = 1e5+5;
struct node{
char op;
int x,y;
}a[N];
int z[15],b[15];
int ans=1e9;
void dfs(int x){
if(x==n+1){
for(int i = 1;i <= n;i++)b[i]=z[i];
for(int i = 1;i <= m;i++){
if(a[i].op=='T'){
b[a[i].x]=1;
}else if(a[i].op=='F'){
b[a[i].x]=2;
}else if(a[i].op=='U'){
b[a[i].x]=3;
}else if(a[i].op=='-'){
if(b[a[i].y]==3){
b[a[i].x]=3;
}else if(b[a[i].y]==2){
b[a[i].x]=1;
}else if(b[a[i].y]==1){
b[a[i].x]=2;
}
}else if(a[i].op=='+'){
if(b[a[i].y]==3){
b[a[i].x]=3;
}else if(b[a[i].y]==2){
b[a[i].x]=2;
}else if(b[a[i].y]==1){
b[a[i].x]=1;
}
}
}
int flag=1;
for(int i = 1;i <= n;i++){
if(b[i] != z[i]){
flag=0;
break;
}
}
int res=0;
for(int i = 1;i <= n;i++){
if(b[i]==3){
res++;
}
}
if(flag){
// cout<<res<<endl;
ans=min(ans,res);
}
return ;
}
for(int i = 1;i <= 3;i++){
z[x]=i;
dfs(x+1);
}
}
char sub2[N];
int sub3[N];
int main(){
freopen("tribool.in","r",stdin);
freopen("tribool.out","w",stdout);
scanf("%d%d",&c,&t);
while(t--){
ans=1e9;
scanf("%d%d",&n,&m);
for(int i = 1;i <= m;i++) {
cin>>a[i].op;
scanf("%d",&a[i].x);
if(a[i].op=='-'||a[i].op=='+'){
scanf("%d",&a[i].y);
}else{
a[i].y=-1;
}
}
if(c<=2){
dfs(1);
printf("%d\n",ans);
}else if(c >= 3 && c <= 4){
int res2=0;
for(int i = 1;i <= n;i++)sub2[i] = ' ';
for(int i = 1;i <= m;i++){
sub2[a[i].x] = a[i].op;
}for(int i=1;i<=n;i++){
if(sub2[i]=='U'){
res2++;
}
}printf("%d\n",res2);
}
// else if(c >= 5 && c <= 6){
// memset(sub3,0,sizeof sub3);
// for(int i = 1;i <= n;i++){
// for(int j = m;j >= 1;j--){
// if(a[i].x == i){
// if(a[i].op=='U'){
// sub3[a[i].x]=1;
// }else break;
// }
// }
// }
// for(int i = 1;i <= n;i++){
// int x =
// }
// }
else dfs(1);
}
return 0;
}
/*
*/
【T3】
- 12:00 终于读完题目啦。不会咋办。
- 12:01 奥,\(n,m = 1\)。 瞎写一通,走人。
#include <bits/stdc++.h>
using namespace std;
int c,n,m,q,x,y;
int main(){
freopen("expand.in","r",stdin);
freopen("expand.out","w",stdout);
scanf("%d%d%d%d",&c,&n,&m,&q);
if(n==1&&m==1){
scanf("%d%d",&x,&y);
while(q--){
int kx,ky;
scanf("%d%d",&kx,&ky);
for(int i = 1;i <= kx;i++){
int a,b;
scanf("%d%d",&a,&b);
if(a==1) x=b;
}for(int i = 1;i <= ky;i++){
int a,b;
scanf("%d%d",&a,&b);
if(a==1) y=b;
}if(x!=y)cout<<'1';
else cout<<'0';
}
}
return 0;
}
【T4】
- 12:15 题面舒服多了,看起来不那么难受,启动状态枚举,8分到手咯。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int M = 1E5+5;
int c,t;
int n,m,k,d;
struct node{
int x,y,z;
}a[M];
int vis[30];
int q[30];
int main(){
freopen("run.in","r",stdin);
freopen("run.out","w",stdout);
scanf("%d%d",&c,&t);
while(t--){
scanf("%d%d%d%d",&n,&m,&k,&d);
for(int i = 1;i <= m;i++){
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
int x=a[i].x-a[i].y+1,y=a[i].x;
a[i].x=x,a[i].y=y;
}
if(c <= 2){
ll ans=0;
for(int z=0;z <= (1 << (n+1));z++){
memset(vis,0,sizeof vis);
memset(q,0,sizeof q);
for(int i = 1;i <= n;i++){
if((1<<i) & z) vis[i]=1;
}
int cnt=0;
int maxx=0;
for(int i =1;i <= n;i++){
if(!vis[i]){
maxx = max(maxx,cnt);
cnt=0;
}else{
cnt++;
}
}maxx = max(maxx,cnt);
if(maxx > k) continue;
for(int i = 1;i <= n;i++) {
q[i] = q[i-1] + vis[i];
}
ll res=-1 * q[n] * d;
for(int i = 1;i <= m;i++){
if(q[a[i].y] - q[a[i].x - 1] == a[i].y - a[i].x + 1) res+=a[i].z;
}ans = max(ans,res);
}printf("%lld\n",ans);
}
}
return 0;
}
总结:
不够细心,时间分配不好,下次要审题仔细,然后抓紧时间。
【估分】
【预估分数】:100+40+0+0 ~ 100+40+5+8 之间。
【小图灵】:90+40+0+0 = 130
【洛谷】:90+40+0+0 = 130
【云斗】:90+40+0+0 = 130
【信友队】:90+40+0+0 = 130
好好好,都是130是吧!!
我瞬间傻了,T1我的做法是要取最大和次大,我也不知道我写一个sort干啥用的!!!!成功将 \(O(2\times nm)\) 的算法提高到 \(O(nm\log n)\),你看我多厉害!!!!赛时还在卡常的我!!!!!!!!!!!!
啊啊啊 啊啊啊 啊啊啊 啊啊啊 啊啊啊 啊啊啊 啊啊啊 啊啊啊 啊啊啊 啊啊啊 啊啊啊 啊啊啊 啊啊啊
祭
点个赞呗
本文来自博客园,作者:gsczl71,转载请注明原文链接:https://www.cnblogs.com/gsczl71/p/17854613.html
gsczl71 AK IOI!RP = INF 2024年拿下七级勾!