A | B | C | D | E | F |
---|---|---|---|---|---|
√ | √ | √ | √ | √ | √ |
( √:做出; ●:尝试未做出; ○:已补题 )
题目地址:https://atcoder.jp/contests/abc174
这一次的题目好简单。
题意:签到题。
思路:
代码:
#define DIN freopen("input.txt","r",stdin);
#define DOUT freopen("output.txt","w",stdout);
#include
#include
#define mem(a,b) memset(a,b,sizeof(a))
#define REP(i,a,b) for(int i=(a);i<=(int)(b);i++)
#define REP_(i,a,b) for(int i=(a);i>=(b);i--)
#define pb push_back
using namespace std;
typedef long long LL;
typedef vector<int> VI;
typedef pair<LL,LL> P;
int read()
{
int x=0,flag=1; char c=getchar();
while((c>'9' || c<'0') && c!='-') c=getchar();
if(c=='-') flag=0,c=getchar();
while(c<='9' && c>='0') {x=(x<<3)+(x<<1)+c-'0';c=getchar();}
return flag?x:-x;
}
int main()
{
int n=read();
puts(n>=30?"Yes":"No");
return 0;
}
题意:签到题。
思路:
代码:
#define DIN freopen("input.txt","r",stdin);
#define DOUT freopen("output.txt","w",stdout);
#include
#include
#define mem(a,b) memset(a,b,sizeof(a))
#define REP(i,a,b) for(int i=(a);i<=(int)(b);i++)
#define REP_(i,a,b) for(int i=(a);i>=(b);i--)
#define pb push_back
using namespace std;
typedef long long LL;
typedef vector<int> VI;
typedef pair<LL,LL> P;
int read()
{
int x=0,flag=1; char c=getchar();
while((c>'9' || c<'0') && c!='-') c=getchar();
if(c=='-') flag=0,c=getchar();
while(c<='9' && c>='0') {x=(x<<3)+(x<<1)+c-'0';c=getchar();}
return flag?x:-x;
}
int main()
{
int tot=0,n=read();
LL d=read();
while(n--)
{
LL x=read(),y=read();
if(x*x+y*y<=d*d) tot++;
}
cout<<tot;
return 0;
}
题意:有一个序列 7, 77, 777, 7777, ....
,现在给出一个正整数 K,问这个序列中最早第几项,可以被 K 整除。如果每个都不能则输出 -1 。
思路:一开始卡了卡没思路,后来发现只要暴力计算 1e6 项序列的每个值取模 K 就行了,如果余数为 0 说明可以整除。(刹那间忘记了整除对应取模为0……)
代码:
#define DIN freopen("input.txt","r",stdin);
#define DOUT freopen("output.txt","w",stdout);
#include
#include
#define mem(a,b) memset(a,b,sizeof(a))
#define REP(i,a,b) for(int i=(a);i<=(int)(b);i++)
#define REP_(i,a,b) for(int i=(a);i>=(b);i--)
#define pb push_back
using namespace std;
typedef long long LL;
typedef vector<int> VI;
typedef pair<LL,LL> P;
int read()
{
int x=0,flag=1; char c=getchar();
while((c>'9' || c<'0') && c!='-') c=getchar();
if(c=='-') flag=0,c=getchar();
while(c<='9' && c>='0') {x=(x<<3)+(x<<1)+c-'0';c=getchar();}
return flag?x:-x;
}
int main()
{
LL k=read(),x=7%k,t=1;
while(1)
{
if(!x) break;
if(t>1000000) break;
x=x*10+7;
x%=k;
t++;
}
if(!x) cout<<t;
else cout<<"-1";
return 0;
}
题意:签到题。
思路:两个指针扫一遍,如果相反就交换就行了。
代码:
#define DIN freopen("input.txt","r",stdin);
#define DOUT freopen("output.txt","w",stdout);
#include
#include
#define mem(a,b) memset(a,b,sizeof(a))
#define REP(i,a,b) for(int i=(a);i<=(int)(b);i++)
#define REP_(i,a,b) for(int i=(a);i>=(b);i--)
#define pb push_back
using namespace std;
typedef long long LL;
typedef vector<int> VI;
typedef pair<LL,LL> P;
int read()
{
int x=0,flag=1; char c=getchar();
while((c>'9' || c<'0') && c!='-') c=getchar();
if(c=='-') flag=0,c=getchar();
while(c<='9' && c>='0') {x=(x<<3)+(x<<1)+c-'0';c=getchar();}
return flag?x:-x;
}
const int maxn=2e5+5;
char s[maxn];
int l,r;
int main()
{
int n=read();
scanf("%s",s+1);
l=1,r=n;
int ans=0;
while(l<=r)
{
while(l<=n && s[l]=='R') l++;
while(r>=1 && s[r]=='W') r--;
if(l<r) swap(s[l],s[r]),ans++;
}
cout<<ans;
return 0;
}
题意:水水的二分题。
思路:因为不理解 round up 是“向上取整”的意思(一直以为是四舍五入,因为有道是这么翻译的_(¦3」∠)_)然后就 WA 了两次。
代码:
#define DIN freopen("input.txt","r",stdin);
#define DOUT freopen("output.txt","w",stdout);
#include
#include
#define mem(a,b) memset(a,b,sizeof(a))
#define REP(i,a,b) for(int i=(a);i<=(int)(b);i++)
#define REP_(i,a,b) for(int i=(a);i>=(b);i--)
#define pb push_back
using namespace std;
typedef long long LL;
typedef vector<int> VI;
typedef pair<LL,LL> P;
int read()
{
int x=0,flag=1; char c=getchar();
while((c>'9' || c<'0') && c!='-') c=getchar();
if(c=='-') flag=0,c=getchar();
while(c<='9' && c>='0') {x=(x<<3)+(x<<1)+c-'0';c=getchar();}
return flag?x:-x;
}
const int maxn=2e5+5;
LL K,n;
double a[maxn],eps=1e-6;
bool can(double len)
{
LL tot=0;
REP(i,1,n)
{
LL x=a[i]/len;
if(fabs(a[i]-len*x)>eps) x++;
tot+=x-1;
if(tot>K) return 0;
}
return 1;
}
int main()
{
n=read(),K=read();
REP(i,1,n) a[i]=read();
double l=1e-5,r=1e9,mid;
while(l<r-0.000001)
{
mid=(l+r)/2;
if(can(mid)) r=mid;
else l=mid;
}
LL x=r+1-eps;
cout<<x;
return 0;
}
题意:有 n 个球,每个球有一种颜色,给出 Q 个询问,每次询问给出 l i , r i l_i, \ r_i li, ri ,要求计算 [ l i , r i ] [l_i,r_i] [li,ri] 区间内的球有多少种不同的颜色。
思路:很经典的主席树(莫队其实也可以,不过复杂度大一点点)。然后权值线段树或树状数组那些什么的也是可以做的。主席树的做法的话好像是设 L[i] 表示第 i 个位置的颜色上一次出现的位置,然后每次询问实际上要统计的就是 ∑ i = l r ( L [ i ] < l ) \sum\limits_{i=l}^r(L[i]
下面的代码显然是离线算法,所以用的不是主席树,我也忘了自己当时用的什么方法了,反正这份代码是直接从洛谷 copy 过来的。
代码:
#define DIN freopen("input.txt","r",stdin);
#define DOUT freopen("output.txt","w",stdout);
#include
#include
#define mem(a,b) memset(a,b,sizeof(a))
#define REP(i,a,b) for(int i=(a);i<=(int)(b);i++)
#define REP_(i,a,b) for(int i=(a);i>=(b);i--)
#define pb push_back
using namespace std;
typedef long long LL;
typedef vector<int> VI;
typedef pair<LL,LL> P;
int read()
{
int x=0,flag=1; char c=getchar();
while((c>'9' || c<'0') && c!='-') c=getchar();
if(c=='-') flag=0,c=getchar();
while(c<='9' && c>='0') {x=(x<<3)+(x<<1)+c-'0';c=getchar();}
return flag?x:-x;
}
#define chl k<<1
#define chr k<<1|1
const int maxn=5e5+5;
int a[maxn],book[2*maxn],n,m,tree[maxn*3],t,ans[maxn];
struct node {int l,r,bianhao;};
node h[maxn];
bool cmp(node &a,node &b)
{
return a.r<b.r;
}
void add(int k,int l,int r,int j,int v)
{
if(j<l || j>r) return;
if(l==r && l==j) {tree[k]+=v;return;}
tree[k]+=v;
int mid=(l+r)>>1;
add(chl,l,mid,j,v);
add(chr,mid+1,r,j,v);
}
int sum(int k,int l,int r,int ll,int rr)
{
if(rr<l || ll>r) return 0;
if(l>=ll && r<=rr) return tree[k];
int mid=(l+r)>>1;
return sum(chl,l,mid,ll,rr)+sum(chr,mid+1,r,ll,rr);
}
int main()
{
n=read(); m=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=0;i<m;i++) h[i].l=read(),h[i].r=read(),h[i].bianhao=i;
sort(h,h+m,cmp);
for(int i=0;i<m;i++)
{
int l=h[i].l,r=h[i].r;
for(int j=t+1;j<=r;j++)
{
if(!book[a[j]]) book[a[j]]=j,add(1,1,n,j,1);
else
{
add(1,1,n,book[a[j]],-1);
book[a[j]]=j;
add(1,1,n,j,1);
}
}
t=r;
ans[h[i].bianhao]=sum(1,1,n,l,r);
}
for(int i=0;i<m;i++)
printf("%d\n",ans[i]);
return 0;
}