开学第3周(cf+训练)
训练赛
天梯赛训练 - Virtual Judge (vjudge.net)
题解:比较🍬的题,需要我们统计24小时内船只上一共有多少个不同国的人
相当于暴力思想,我们直接开一个map记录每个国人数情况,然后算一下时间状态,用双指针然后前面超过24小时的就直接记录个数减减即可
#include <bits/stdc++.h> //#pragma GCC optimize("Ofast") #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <cmath> //#define double long double #define int long long #define endl '\n' using namespace std; const int N=1e5+10,M=1e1; const int INF = 0x3f3f3f3f; const int mod=1e9+7; typedef pair<int,int> PII; int kmp(int a,int k,int p) { int ans=1; while (k) { if(k&1) ans=ans*a%p; k>>=1; a=a*a; } return ans; } struct G { int t,k; }a[N]; vector< int> b[N]; map<int,int> mp; void solve() { int n; cin>>n; int ans=0; int l=1; for(int i=1;i<=n;i++) { int t,k; cin>>t>>k; a[i]={t,k}; for(int j=1;j<=k;j++) { int x; cin>>x; b[i].push_back(x); mp[x]++; if(mp[x]==1) ans++; } while (a[i].t-a[l].t>=86400) { for (auto x: b[l]) { mp[x]--; if (mp[x] == 0) ans--; } l++; } cout<<ans<<endl; } } signed main(){ std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int T=1; // cin>>T; while(T--){ solve(); } return 0; }
天梯赛训练 - Virtual Judge (vjudge.net)
洛谷p5657

题解:我们可以倒着去思考
看看规律我们可以发现,在n的次幂里有pow(2,n)个数,pow(2,n)/2 左边的数全是通过加0,右边的数是加一
所以我们从最后开始推断,k如果大于pow(2,n)/2 那么这一位就是加一,如果小于或者等于那就是加0 一位一位向上推
这里就需要更新这个k看看下面一个是由上面哪一个推出来的
画图发现
如果是右边就是pow(2,n)-1-k 就是上一个坐标位置 如果在左边那就是原来的k不动
比如n==3,k==5 那么n==2的时候就是pow(2,3)-1-5==2 也就是上一个的坐标 以此类推
记得开--int128 2的64太大
#include <bits/stdc++.h> //#pragma GCC optimize("Ofast") #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <cmath> //#define double long double #define int long long #define endl '\n' using namespace std; const int N=1e5+10,M=1e1; const int INF = 0x3f3f3f3f; const int mod=1e9+7; typedef pair<int,int> PII; int kmp(int a,int k,int p) { int ans=1; while (k) { if(k&1) ans=ans*a%p; k>>=1; a=a*a; } return ans; } void solve() { int n,k; cin>>n>>k; string s; for(int i=n;i>=1;i--) { int x=((__int128)1<<i)-1; if(k>x/2) { s+='1'; k=x-k; } else { s+='0'; } } cout<<s<<endl; } signed main(){ std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int T=1; // cin>>T; while(T--){ solve(); } return 0; }