CF- #515 (Div. 3),A,B,C,E
阿新 • • 發佈:2019-02-18
A. Vova and Train
題目大意:給出一個序列,問遮擋了多少
1~n,然後每v個位置有一個數,問除去l~r覆蓋了的點,還剩多少個點,
解題:找規律模擬即可
ac:
//#pragma comment(linker, "/STACK:1024000000,1024000000") #include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> //#include<map> //#include<set> #include<deque> #include<queue> #include<stack> #include<bitset> #include<string> #include<fstream> #include<iostream> #include<algorithm> using namespace std; #define ll long long //#define max(a,b) (a)>(b)?(a):(b) //#define min(a,b) (a)<(b)?(a):(b) #define clean(a,b) memset(a,b,sizeof(a))// ˮӡ //std::ios::sync_with_stdio(false); const int MAXN=1e5+5; const ll INF=0x3f3f3f3f; const ll mod=1e9+7; int main() { std::ios::sync_with_stdio(false); int t; cin>>t; while(t--) { ll L,v,l,r; cin>>L>>v>>l>>r; ll sum=L/v; ll sum_l=(l-1)/v,sum_r=r/v; ll ans=sum-(sum_r-sum_l); cout<<ans<<endl; } }
B. Heaters
題目大意:輸入n(有n個房子),m(每個有暖氣的房子覆蓋的範圍)
然後是這n個房子分別的狀態0無暖氣,1有暖氣
輸出最少的讓多少房子有暖氣能使這些房子都暖和,沒可能輸出-1
解題:貪心,遍歷一遍;
ac:
C. Books Queries
題目大意:給出n個操作,每次操作可以選擇從右或左插入一個數,或者訪問數x距離邊界的最短距離,輸出最短距離。
解題:對於每個數,都記錄一下右邊有多少個,左邊有多少個,然後直接輸出即可。
ac:
//#pragma comment(linker, "/STACK:1024000000,1024000000") #include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> //#include<map> //#include<set> #include<deque> #include<queue> #include<stack> #include<bitset> #include<string> #include<fstream> #include<iostream> #include<algorithm> using namespace std; #define ll long long //#define max(a,b) (a)>(b)?(a):(b) //#define min(a,b) (a)<(b)?(a):(b) #define clean(a,b) memset(a,b,sizeof(a))// ˮӡ //std::ios::sync_with_stdio(false); const int MAXN=2e5+55; const ll INF=0x3f3f3f3f; const ll mod=1e9+7; struct node{ int l,r; }a[MAXN]; int id[MAXN]; int main() { std::ios::sync_with_stdio(false); int n; while(cin>>n) { clean(a,0); clean(id,0); char oper; int data; cin>>oper>>data; if(oper!='?')//首先是第一個 id[data]=1; a[1].l=0,a[1].r=0; int l=1,r=1;//初始化節點 for(int j=2,i=2;j<=n;++j)//j個操作 { cin>>oper>>data; if(oper=='L')//插左邊 { id[data]=i;//他是第i個 a[i].l=a[l].l+1;//是左邊的那個+1 a[i].r=-a[i].l;//右邊的繼續 l=i;//重新整理l i++; } else if(oper=='R')//插右邊 { id[data]=i; a[i].r=a[r].r+1; a[i].l=-a[i].r; r=i; i++; } else//訪問 { // cout<<"----------"<<endl; // cout<<l<<" "<<r<<endl; // cout<<a[l].l<<" "<<a[r].r<<endl; // cout<<a[id[data]].l<<" "<<a[id[data]].r<<endl; // cout<<"----------"<<endl; int num_l=a[l].l-a[id[data]].l; int num_r=a[r].r-a[id[data]].r; int ans=num_l>num_r?num_r:num_l; cout<<ans<<endl; } } } }
E. Binary Numbers AND Sum
題目大意:輸入兩個n,m分別代表兩個字串的長度,然後輸入兩個字串a,b,都是二進位制數,然後進行:
ll sum=0;
while(b)
{
sum=sum+a&b;
b=b>>1;
}
運算,知道b表示的二進位制數為0;
解題:其實暴力迴圈肯定超時,因此我們看對於a中的每一位數,它能夠和b&多少次,然後記錄下來,再遍歷一遍a,對於每一位都加起來得到sum
ac:
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
//#include<map>
//#include<set>
#include<deque>
#include<queue>
#include<stack>
#include<bitset>
#include<string>
#include<fstream>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
//#define max(a,b) (a)>(b)?(a):(b)
//#define min(a,b) (a)<(b)?(a):(b)
#define clean(a,b) memset(a,b,sizeof(a))// ˮӡ
//std::ios::sync_with_stdio(false);
const int MAXN=2e5+15;
const ll INF=1e18;
const ll mod=998244353;
char a[MAXN],b[MAXN];
int rea[MAXN],reb[MAXN],newb[MAXN];
ll take(ll a,ll b)
{
ll res=0;
while(b)
{
if(b&1)
res=(res+a)%mod;
a=(a+a)%mod;
b=b>>1;
}
return res;
}
ll quick(ll a,ll n)
{
ll res=1;
while(n)
{
if(n&1)
res=(res*a)%mod;
a=(a*a)%mod;
n=n>>1;
}
return res;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
clean(a,'\0');
clean(b,'\0');
clean(rea,0);
clean(reb,0);
clean(newb,0);
scanf("%s%s",&a,&b);
//printf("%s\n%s\n",a,b);
int a_num=0,b_num=0;
for(int i=0;i<m;++i)//