CF331A1,331A2
生活随笔
收集整理的這篇文章主要介紹了
CF331A1,331A2
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鏈接:http://codeforces.com/problemset/problem/331/A1
題意:不翻譯了。
思路:A1題數據范圍小,暴力是可行的,我果斷暴力了。不過,話說,除了暴力我還會什么。。。閑話少說。A2的話,采用線段樹。不過我不會,哈哈哈。找了位仁兄的代碼看了一下,思路比較巧妙,值得學習,雖然沒有用到數據結構,但是可以解決。不過我忘記是哪位仁兄的了,你要是看到了的話,提醒我一下。就貼那位仁兄的代碼吧。
#include <iostream> #include <vector> #include <map>using namespace std;#define INF 3000000000ll map<int, int> last; int a[300010]; long long sum[300010]; vector<int> v; int main() {int n;cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];last[a[i]] = i;//記錄下來了每個數字的最后出現的位置if (a[i] > 0)sum[i] = sum[i - 1] + a[i];elsesum[i] = sum[i - 1];}long long ans = -INF, d = 0;for (int i = 1; i <= n; i++){if (last[a[i]] != i)//不相等說明i和last[a[i]]是個符合要求的區間,比起雙重循環降低復雜度啊{//a[i]的首位置是i,末位置是last[a[i]]long long k = sum[last[a[i]] - 1] - sum[i] + a[i] * 2;if (k > ans){ans = k;d = i;}}}for (int i = 1; i < d; i++)v.push_back(i);for (int i = d + 1; i <= last[a[d]] - 1; i++)if (a[i] < 0)v.push_back(i);for (int i = last[a[d]] + 1; i <= n; i++)v.push_back(i);cout << ans << " " << v.size() << endl;for (int i = 0; i < v.size(); i++)cout << v[i] << " "; }
以后學了高級方法再來做一次吧。
轉載于:https://www.cnblogs.com/54zyq/p/3201356.html
總結
以上是生活随笔為你收集整理的CF331A1,331A2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS+CSS点击弹出登陆框代码
- 下一篇: 求一个小男孩好听的英文名字