8.27

今天还是在高中

写了一下CSP-S2020的题目

我看难度评级写的,先写了 \(T2\)

然后 \(T1\) 搞了快两小时了,没搞出来,精神萎靡了

放一下 \(T1\) 的代码尸体,求调,样例2就过不去

P7075

CODE
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int rd400=146097;
const int bg=-4712;
void read(int& x){
	char c;
	bool f=0;
	while((c=getchar())<48) f|=(c==45);
	x=c-48;
	while((c=getchar())>47) x=(x<<3)+(x<<1)+c-48;
	x=(f ? -x : x);
	return;
}
int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool is_run(int x){
	return (x%4==0&&x%100!=0)||(x%400==0);
}
int cal_year(int x,int y){
	int sum=0;
	while(x<y&&(x-1)%400){
		if(is_run(x)) sum+=366;
		else sum+=365;
		++x;
	}
	while(y>=x&&y%400){
		if(is_run(y)) sum+=366;
		else sum+=365;
		--y;
	}
	sum+=(y-x+1)/400*rd400;
	return sum;
}
int cal(int x,int y){
	if(x<0&&y<0) return cal_year(x,y);
	if(x<0&&y>0) return cal_year(x,-1)+cal_year(1,y);
	if(x>0&&y>0) return cal_year(x,y);
	if(x==0) return cal_year(1,y);
	if(y==0) return cal_year(x,-1);
}
int q,n;
signed main(){
	read(q);
	while(q--){
		read(n);
		int l=bg-1,r=1e9+1;
		int ans=bg;
		while(l<=r){
			int mid=(l+r)>>1;
			if(cal(bg,mid)<=n) ans=mid,l=mid+1;
			else r=mid-1;
		}
		n-=cal(bg,ans);
		if(is_run(ans)) mon[2]=29;
		else mon[2]=28;
		int m=0,d=0;
		for(int i=1;i<=12;i++){
			if(n-mon[i]<0){
				m=i,d=n+1;
				break;
			}
			else n-=mon[i];
		}
		printf("%lld %lld %lld",d,m,(ans<0 ? -ans : ans));
		if(ans<0) printf(" BC");
		putchar('\n');
	}
	return 0;
}
//^o^

T2

模拟,然后没了

CODE
#include<bits/stdc++.h>
#define usetime() (double)clock () / CLOCKS_PER_SEC * 1000.0
using namespace std;
typedef unsigned long long LL;
const int maxn=1e6+5;
const int maxk=75;
void read(int& x){
	char c;
	bool f=0;
	while((c=getchar())<48) f|=(c==45);
	x=c-48;
	while((c=getchar())>47) x=(x<<3)+(x<<1)+c-48;
	x=(f ? -x : x);
}
void read(LL& x){
	char c;
	while((c=getchar())<48);
	x=c-48;
	while((c=getchar())>47) x=(x<<3)+(x<<1)+c-48;
}
int n,m,c,k;
LL a[maxn];
vector<int> need[maxk];
unordered_map<int,bool> mp;
bool vis[maxk];
int main(){
	read(n),read(m),read(c),read(k);
	for(int i=1;i<=n;i++) read(a[i]);
	int p,q;
	for(int i=1;i<=m;i++){
		read(p),read(q);
		need[p].push_back(q);
	}
	for(int i=1;i<=n;i++){
		LL j=a[i];
		int cnt=0;
		while(j){
			if(j&1) vis[cnt]=1;
			++cnt,j>>=1;
		}
	}
	for(int i=0;i<k;i++){
		if(vis[i]){
			for(int j=0;j<(int)need[i].size();j++){
				mp[need[i][j]]=1;
			}
		}
	}
	int cnt=0;
	for(int i=0;i<k;i++){
		bool f=1;
		for(int j=0;j<(int)need[i].size();j++){
			if(!mp[need[i][j]]){
				f=0;
				break;
			}
		}
		if(f) ++cnt;
	}
	if(cnt==64&&n==0){
		printf("18446744073709551616");
		return 0;
	}
	LL ac=1;
	while(cnt--) ac<<=1;
	printf("%llu",ac-n);
	return 0;
}
//^o^

精神不好就没必要继续了

先留一下P7077吧

做了一下CSP-S2024-T2,去年没有 A

发现其实还挺简单的

P11232

就是计算一下每辆车的超速区间,这个用二分即可

然后简化一下问题

数轴上有 \(m\) 个点 \(n\) 个区间,问若每个区间内至少包含一个点,最多能够删去几个点?

先去掉那些包裹着其他区间的区间,若包裹着的区间内有点,则该区间内一定有点

这一步可以排序后通过单调栈实现

这是,区间图大概是长这样的

image

即在左端点排过序后,右端点一定也是有序的

此时我们发现,贪心将点放在一个区间内尽量靠右的位置是最优的

CODE
#include<bits/stdc++.h>
#define fst first
#define sec second
#define mkp(a,b) make_pair(a,b)
#define usetime() (double)clock () / CLOCKS_PER_SEC * 1000.0
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
const int maxn=1e5+5;
const double eps=0.000001;
void read(int& x){
	char c;
	bool f=0;
	while((c=getchar())<48) f|=(c==45);
	x=c-48;
	while((c=getchar())>47) x=(x<<3)+(x<<1)+c-48;
	x=(f ? -x : x);
	return;
}
struct car{
	int st,v,a;
};
int t;
int n,m,s,lim;
car c[maxn];
int d[maxn];
int st[maxn],tp=0;
bool check(int id,int x){
	x-=c[id].st;
	int v=c[id].v*c[id].v+2*c[id].a*x;
	return v>lim;
}
int main(){
	read(t);
	while(t--){
		read(n),read(m),read(s),read(lim);
		lim=lim*lim;
		for(int i=1;i<=n;i++) read(c[i].st),read(c[i].v),read(c[i].a);
		for(int i=1;i<=m;i++) read(d[i]);
		sort(d+1,d+m+1);
		vector<pii> v;
		for(int i=1;i<=n;i++){
			if((!check(i,c[i].st))&&(!check(i,s))) continue;
			if(c[i].a>0){
				int l=c[i].st,r=s;
				int ans=s;
				while(l<=r){
					int mid=(l+r)>>1;
					if(check(i,mid)) ans=mid,r=mid-1;
					else l=mid+1;
				}
				int p=lower_bound(d+1,d+m+1,ans)-d;
				if(p==m+1) continue;
				v.push_back(mkp(ans,s));
			}
			else if(c[i].a<0){
				int l=c[i].st,r=s;
				int ans=c[i].st;
				while(l<=r){
					int mid=(l+r)>>1;
					if(check(i,mid)) ans=mid,l=mid+1;
					else r=mid-1;
				}
				int p=lower_bound(d+1,d+m+1,c[i].st)-d;
				if(p==m+1||d[p]>ans) continue;
				v.push_back(mkp(c[i].st,ans));
			}
			else{
				int p=lower_bound(d+1,d+m+1,c[i].st)-d;
				if(p==m+1) continue;
				v.push_back(mkp(c[i].st,s));
			}
		}
		sort(v.begin(),v.end());
		tp=0;
		for(int i=0;i<(int)v.size();i++){
			while(tp&&(v[st[tp]].sec>=v[i].sec)) --tp;
			st[++tp]=i;
		}
		int lst=-1,ans=0;
		for(int i=1;i<=tp;i++){
			if(v[st[i]].fst<=lst) continue;
			lst=*(upper_bound(d+1,d+m+1,v[st[i]].sec)-1),++ans;
		}
		printf("%d %d\n",(int)v.size(),m-ans);
	}
	return 0;
}
//^o^
posted @ 2025-08-27 21:02  huangems  阅读(21)  评论(0)    收藏  举报