8.27
今天还是在高中
写了一下CSP-S2020的题目
我看难度评级写的,先写了 \(T2\)
然后 \(T1\) 搞了快两小时了,没搞出来,精神萎靡了
放一下 \(T1\) 的代码尸体,求调,样例2就过不去
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
发现其实还挺简单的
就是计算一下每辆车的超速区间,这个用二分即可
然后简化一下问题
数轴上有 \(m\) 个点 \(n\) 个区间,问若每个区间内至少包含一个点,最多能够删去几个点?
先去掉那些包裹着其他区间的区间,若包裹着的区间内有点,则该区间内一定有点
这一步可以排序后通过单调栈实现
这是,区间图大概是长这样的

即在左端点排过序后,右端点一定也是有序的
此时我们发现,贪心将点放在一个区间内尽量靠右的位置是最优的
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^

浙公网安备 33010602011771号