A:https://ac.nowcoder.com/acm/contest/1085/A
题意:
题目本意是用若干个区间覆盖长度为n的数轴,最后问没有覆盖到的区间最大长度
题解:
排序,从左到右维护最大值
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxx = 100005;
struct node{
int l,r;
bool operator <(const node& y)const
{
if(l == y.l)
return r < y.r;
return l < y.l;
}
}a[maxx];
int main()
{
int n,m,ans = 0;
scanf("%d %d",&m,&n);
for(int i=1;i<=n;i++)
{
scanf("%d %d",&a[i].l,&a[i].r);
}
a[++n].l = 0,a[n].r = 0;
a[++n].l = m+1,a[n].r = m+1;
sort(a+1,a+1+n);
for(int i=2,j=1;i<=n;i++)
{
if(a[i].l <= a[j].r)
a[j].r = max(a[j].r,a[i].r);
else{
ans = max(ans,a[i].l - a[j].r -1);
j = i;
}
}
cout<<ans<<endl;
return 0;
}C:https://ac.nowcoder.com/acm/contest/1085/C
题意:
给你一个数列,输出这个数列中,出现次数为奇数个的数字的异或和
题解:
真是自己sb了,直接从头到尾异或,因为出现次数为偶数的直接异或为0
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxx = 1010;
ll x;
int main()
{
int n,cnt = 0;
scanf("%d",&n);
ll ans = 0 ;
for(int i=1;i<=n;i++){
scanf("%lld",&x);
ans ^= x;
}
printf("%lld\n",ans);
return 0;
}
F:https://ac.nowcoder.com/acm/contest/1085/F
题意:
数学求缺球的高
题解:
直接套公式,注意精度问题
V = pai(h*h(r - h/3);h是缺球的高,r是球的半径,V是缺球的面积,pai是3.1415926
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
double R,v,h = 0,pai = 3.1415926;
double esp = 0.0001;
int main()
{
cin>>R>>v;
double l = 0, r = 2*R , h , ans;
while(r - l >= esp)
{
h = (l + r)/2;
ans = pai*h*h*(R - h/3);
if(ans - v > esp){
r = r - esp;
}
else{
l = l + esp;
}
}
printf("%.2lf\n",2*R - h);
return 0;
}G:https://ac.nowcoder.com/acm/contest/1085/G
题意:
给出序列,每次输出[l,r]区间上的 ai*sum(ai) 的和 ,sum(ai)代表ai在区间[l,r]上区间的次数
题解:
莫队(不会,先放下,记得补)
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxx = 100010;
const int blo = 310;
struct node{
int l,r,id;
bool operator < (node x)const
{
return l/blo == x.l/blo ? r < x.r : l < x.l;
}
};
node b[maxx];
ll ans1[maxx];
int n,m,a[maxx],cnt[maxx];
ll ans = 0;
void add(int x,int v)
{
ans -= 1ll*(cnt[x]*cnt[x]*x);
cnt[x] += v;
ans += 1ll*(cnt[x]*cnt[x]*x);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=m;i++){
scanf("%d%d",&b[i].l,&b[i].r);
b[i].id = i;
}
sort(b+1,b+1+m);
int l = 1,r = 1;
add(a[1],1);
for(int i=1;i<=m;i++){
int L = b[i].l , R = b[i].r;
while(L < l) add(a[--l],1);
while(r < R) add(a[++r],1);
while(l < L) add(a[l++],-1);
while(r > R) add(a[r--],-1);
ans1[b[i].id] = ans;
}
for(int i=1;i<=m;i++){
printf("%lld\n",ans1[i]);
}
return 0;
}J:https://ac.nowcoder.com/acm/contest/1085/J
题意:
有一个含有n个数字的序列,每个数的大小是不超过1000的正整数,同时这个序列是个单调不增序列。但是很不幸的是,序列在保存过程中有些数字丢失了,计算出有多少种不同的序列满足上述条件,答案对1e9+7取模。
题解:
设dp[i][j]代表长度为i,最后一位为j的非递增序列的个数;
则推导出来 dp[i][j] = C(i+j-1,i);
如果遇到5 0 0 0 2 就是dp[4][5-2+1]
这里打表2000的C(x,y)要学习一下。
##代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1000005;
ll k1[maxn],k2[maxn],a[maxn];
ll pow_mod(ll a,ll b,ll mod){
ll ans = 1;
while(b){
if(b&1)
ans = ans*a%mod;
a = a*a%mod;
b>>=1;
}
return ans;
}
const ll mod = 1e9+7;
void init(){
k1[0] = 1,k2[0] = 1;
for(int i=1;i<=maxn;i++){
k1[i] = (k1[i-1]*i)%mod;
k2[i] = pow_mod(k1[i],mod-2,mod);
}
}
ll C(ll x,ll y){
if(y == 0)
return 1;
return ((k1[x]%mod*k2[y]%mod)%mod*k2[x-y]%mod)%mod;
}
int main()
{
int n,cnt = 0,pre = 1000;
ll ans = 1;
scanf("%d",&n);
init();
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
a[n+1] = 1;
for(int i=1;i<=n+1;i++){
if(a[i]){
int k = pre - a[i] + 1;
ans *= C(k+cnt-1,cnt);
ans %= mod;
pre = a[i];
cnt = 0;
}else{
cnt++;
}
}
printf("%lld\n",ans);
return 0;
}

京公网安备 11010502036488号