Codeforces Round #613 (Div. 2)

日常掉分,还是不够细心,第二题的全零数据直接把我干掉QAQ
感觉自己比赛时写的代码太乱了,赛后还是得想想怎么写更短小精悍。
A - Mezo Playing Zoma
B - Just Eat It!
C - Fadi and LCM
D Dr. Evil Underscores
E Delete a Segment

## A - Mezo Playing Zoma ### 题意:给出长度为n的字符串,只有L和R,也就是向左向右。每一步都有可能出故障,问最终的位置有多少种可能。 ### 解法:假设向左走的都出故障,那向右有R的个数种可能,反过来也一样,然后加上原点,也就是全出故障。我们发现直接n+1就是答案。
void solve()
{
    int n; string s;
    cin >> n>>s;
    cout<<n+1<<"\n";
}

int main()
{
        solve();
    return 0;
}
## B - Just Eat It! ### 题意:给出一个数组,问其子数组是否全都小于数组,比较的数组的和。 ### 解法:求前缀和,后缀和是否有<=0的值,有就输出NO,否则输出YES
const int N = 466666;
ll a[N];
void solve()
{
   int n;
   scanf("%d", &n);
   for(int i = 1; i <= n; ++i) scanf("%lld", &a[i]);
   ll sum = 0, sumh = 0;
   for(int i = 1; i < n; ++i) {
    sum += a[i];
    sumh += a[n-i+1];
    if(sum <= 0||sumh<=0) {
        puts("NO");
        return ;
    }
   }
   puts("YES");
}
int main()
{
    int t;
    scanf("%d", &t);
    while(t--)
        solve();
    return 0;
}
## C - Fadi and LCM ### 题意:给出n。求满足最小公倍数是n的两个数,求出最小的两个数的最大值。 ### 解法:暴力就完了,开个根号。

void solve()
{
   ll x;
   scanf("%lld", &x);
   ll a, b;
   for(ll i = 1; i*i <= x; ++i) {
    if(x%i == 0&&__gcd(i, x/i)==1) {
        a = i, b = x/i;
    }
   }
   printf("%lld %lld\n", a, b);
}
int main()
{
//    int t;
//    scanf("%d", &t);
//    while(t--)
        solve();
    return 0;
}
## D Dr. Evil Underscores ### 题意:给出一个数组,有一个数x,数组里的的数与x进行异或运算的最大值。让最大值最小,并写出最小值, ### 解法:类似与字典树,建完树直接搜,本题是在搜索的过程中进行建树。
#include 
#include 
#include
#include
#include
#include
#include
#include
using namespace std;
#define debug(x) cout<<#x<<" = "<
#define nl cout <<"\n"
#define gg cout<<"-----------QAQ---------\n"
typedef long long ll;
const int N = 266666;
 
ll a[N];
 
ll dfs(ll depth, int l, int r)
{
    if(depth < 0) return 0;
    ll u = ((ll)1<<depth);
    ll f = 0, pre = 0;
    f = a[l]&u;
    for(int i = l+1; i <= r; ++i) {
        ll t = a[i]&u;
        if(t!=f) {
            pre = i; break;
        }
    }
    if(!pre) return dfs(depth-1, l, r);
    return min(dfs(depth-1, l, pre-1), dfs(depth-1, pre, r))+u;
}
int main()
{
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) scanf("%lld", &a[i]);
    sort(a+1, a+n+1);
    ll ans = dfs(30, 1, n);
    printf("%lld\n", ans);
}
## E Delete a Segment ### 题意:给出多个区间,求删除其中一个区间剩下区间组成的最大独立区间个数(去重) ### 解法:只要考虑这个区间是否独立,与之想覆盖的区间。(借鉴一位大佬的)
#include
#define debug(x) cout <<#x<<" = "<
#define gg cout <<"-------------QAQ---------------"<
#define fi first
#define se second
#define pb push_back
#define SZ(x) ((int)x.size())
#define L(i,u) for (register int i=head[u]; i; i=nxt[i])
#define rep(i,a,b) for (register int i=(a); i<=(b); i++)
#define per(i,a,b) for (register int i=(a); i>=(b); i--)
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef pair<int,int> pii;
typedef vector<int> Vi;
template<class T> inline void read(T &x){
	x=0; char c=getchar(); int f=1;
	while (!isdigit(c)) {if (c=='-') f=-1; c=getchar();}
	while (isdigit(c)) {x=x*10+c-'0'; c=getchar();} x*=f;
}
const int N = 466666;
void FAST(){ios::sync_with_stdio(false);cin.tie(0);}
 
pii a[N];
int ans[N];
void solve()
{
    int n, l, r;
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) {
        scanf("%d%d", &l, &r);
        a[2*i-1] = pii(l, -i);
        a[2*i] = pii(r, i);
        ans[i] = 0;
    }
    sort(a+1, a+2*n+1);
    int c = 0;
    multiset<int> s;
    for(int i = 1; i <= 2*n; ++i)
    {
        if(a[i].second < 0) s.insert(-a[i].second);
        else s.erase(s.find(a[i].second));
        c += (s.size()==0);
        if(s.size()==1&&a[i].se>0&&a[i+1].se<0&&a[i+1].fi>a[i].fi)
            ans[*s.begin()]++;
        if(s.size()==1&&a[i].se<0&&a[i+1].second>0) //其单独成一段的情况
            ans[*s.begin()]--;
 
    }
    int Ans = -1;
    for(int i = 1; i <= n; ++i)
        Ans = max(Ans, ans[i]);
    printf("%d\n", c+Ans);
}
int main()
{
    int t;
    scanf("%d", &t);
    while(t--)
        solve();
    return 0;
}

你可能感兴趣的:(codefroces)