题目:Little C Loves 3 II
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
int main()
{
LL n, m;//注意long long 会爆int的
scanf("%lld %lld", &n, &m);
LL ans = 0;
if(n > m)swap(n, m);
if(n == 1)
{
if( m % 6 == 0 )
printf("%lld\n", m);
else if( m % 6 <= 3 )
printf("%lld\n", m-(m%6));
else printf("%lld\n", m-(6-m%6));
}
else if( n == 2 && m == 2 )
printf("%d\n", 0);
else if( n == 2 && m == 3 )
printf("%d\n", 4);
else if( n == 2 && m == 7 )
printf("%d\n", 12);
else
{
if(n % 2 == 1 && m % 2 == 1)
{
ans = (n*m-1);
printf("%lld\n", ans);
}
else
{
ans = (n*m);
printf("%lld\n", ans);
}
}
return 0;
}
题目:Anton and Making Potions
二分+贪心
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn = 2e5+10;
LL a[maxn], b[maxn], c[maxn], d[maxn];
int main(){
LL n, m, k, x, s;
scanf("%lld %lld %lld", &n, &m, &k);
scanf("%lld %lld", &x, &s);
LL ans = x*n;//不使用药剂可能是最优的结果
for(int i = 1; i <= m; i++)scanf("%lld", &a[i]);
for(int i = 1; i <= m; i++)scanf("%lld", &b[i]);
for(int i = 1; i <= k; i++)scanf("%lld", &c[i]);
for(int i = 1; i <= k; i++)scanf("%lld", &d[i]);
a[m+1] = x;//该点的作用是只选第二种药剂
for(int i = 1; i <= m+1; i++){
if(b[i] <= s){
int pos = upper_bound(d+1, d+1+k, s-b[i])-d;
if(pos <= 0){
ans = min(ans, n*a[i]);
}
else{
pos--;
ans = min(ans, (n-c[pos])*a[i]);
}
}
}
printf("%lld\n", ans);
return 0;
}
题目:Knight Tournament
线段树:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e5+10;
#define LL long long
LL st[maxn<<2], a[maxn<<2];
void build(int o, int l, int r)
{
if(l == r)st[o] = 0;
else
{
int m = l + ((r-l)>>1);
build(o<<1, l, m);
build(o<<1|1, m+1, r);
st[o] = min(st[o<<1],st[o<<1|1]);
}
}
void update(int o,int l,int r,int ql, int qr, int v)
{
if(st[o])return;
if(l==r) //若当前更新点的左右端点相等即到叶子结点时,直接更新信息并返回
{
st[o] = v;
return;
}
if(ql<=l&&qr>=r&&st[o] != 0)//如果区间内的所有数都是1则不必更新
return;
int m = l+((r-l)>>1);
if(ql<=m)
update(o<<1,l,m, ql, qr, v);
if(m+1<=qr)
update((o<<1)|1,m+1,r, ql, qr,v);
st[o] = min(st[o<<1],st[(o<<1)|1]);//递归回之后用儿子结点更新父节点(此处是区间最大值)
}
LL query(int o,int l,int r,int ql,int qr)
{
if(ql<=l&&qr>=r) return st[o];
int m=l+((r-l)>>1);
LL ans=0;//所需查询的结果
if(ql<=m)ans+=query(o<<1,l,m,ql,qr);
if(qr>=m+1)ans+=query(o<<1|1,m+1,r,ql,qr);
return ans;
}
int main()
{
int n, m;
int ca = 0;
scanf("%d %d", &n, &m);
build(1, 1, n);
while(m--)
{
int op, l, r;
scanf("%d %d %d", &l, &r, &op);
if(l <= op-1)
{
update(1, 1, n, l, op-1, op);
}
if(op+1<= r){
update(1, 1, n, op+1, r, op);
}
}
for(int i = 1; i <= n; i++)
{
if(i != 1)printf(" ");
printf("%d",query(1, 1, n, i, i));
}
printf("\n");
return 0;
}
set:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e5+10;
int ans[maxn];
int main()
{
int n, m, a, b, c;
set<int>s;
set<int>::iterator pos;
s.clear();
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++)
{
s.insert(i);
}
for(int i = 1; i <= m; i++)
{
scanf("%d %d %d", &a, &b, &c);
pos = s.lower#_bound(a);
while(*pos <= b && pos != s.end())
{
int h = *pos;
pos++;//注意这块,先自增在删除
if(h != c)
{
ans[h] = c;
s.erase(h);
}
}
}
for(int i = 1; i <= n; i++)
{
if(i != 1)printf(" ");
printf("%d", ans[i]);
}
printf("\n");
return 0;
}